// Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
// for details on configuring this project to bundle and minify static web assets.

// Write your JavaScript code.

$(function () {
    // 사이드 바 토글 유지
    let isHidden = aside.isHidden();

    if (isHidden) {
        aside.hideAside();
    } else {
        aside.showAside();
    }

    // 사이드바 스크롤 위치 복원
    const savedAsideScroll = sessionStorage.getItem("aside-scroll");
    if (savedAsideScroll) {
        document.getElementById("aside").scrollTop = parseInt(savedAsideScroll);
    }

    // 메인 콘텐츠 스크롤 위치 복원
    const savedMainScroll = sessionStorage.getItem("main-scroll");
    if (savedMainScroll) {
        document.getElementById("main").scrollTop = parseInt(savedMainScroll);
    }
});

// 페이지 이동 전 스크롤 위치 저장
window.addEventListener("beforeunload", function () {
    sessionStorage.setItem("aside-scroll", document.getElementById("aside").scrollTop);
    sessionStorage.setItem("main-scroll", document.getElementById("main").scrollTop);
});

// 좌측 메뉴 처리
class Aside {
    constructor() {
        this.body = document.body;
        this.aside = document.getElementById("aside");
        this.btnAsideToggle = document.getElementById("btnAsideToggle");
    }

    // 사이드 바 토글 시
    toggleAside(e) {
        let isHidden = this.isHidden();

        if (isHidden) {
            aside.showAside();
        } else {
            aside.hideAside();
        }
        setCookie("hidden-aside", isHidden ? "visible" : "hidden", 7);
    }

    // 사이드 바 토글 시 아이콘 변경
    toggleAsideIcon (isHidden) {
        let icon = this.btnAsideToggle.querySelector("i");
        if (isHidden) {
            icon.classList.remove("bi-arrow-left");
            icon.classList.add("bi-arrow-right");
        } else {
            icon.classList.remove("bi-arrow-right");
            icon.classList.add("bi-arrow-left");
        }
    };

    // 숨김 여부 확인
    isHidden() {
        let isHidden = getCookie("hidden-aside") ;
        if (isHidden == "") {
            isHidden = this.body.classList.contains("hidden-aside");
        }
        return (isHidden === "hidden");
    }

    // 보이기
    showAside() {
        this.body.classList.remove("hidden-aside");
        this.toggleAsideIcon(0);
        setCookie("hidden-aside", "visible", 7);
    }

    // 숨기기
    hideAside() {
        this.body.classList.add("hidden-aside");
        this.toggleAsideIcon(1);
        setCookie("hidden-aside", "hidden", 7);
    }
}

const aside = new Aside();

document.getElementById("btnAsideToggle").addEventListener("click", (e) => aside.toggleAside(e));

// 화면이 작아지면
window.addEventListener("resize", function () {
    if (window.innerWidth > 768) {
        aside.showAside(0);
    } else {
        aside.hideAside(1);
    }
});

// 메뉴 토글 유지
document.querySelectorAll(".collapse").forEach(e => {
    const collapseID = e.id;
    const collapseState = getCookie(collapseID);

    const instance = bootstrap.Collapse.getOrCreateInstance(e, {
        toggle: false
    });

    if (collapseState === "open") {
        instance.show();
    } else {
        instance.hide();
    }

    e.addEventListener("show.bs.collapse", () => {
        setCookie(collapseID, "open", 7);
    });

    e.addEventListener("hide.bs.collapse", () => {
        setCookie(collapseID, "closed", 7);
    });
});

// 드롭박스 적용
const dropdownList = [...document.querySelectorAll('.dropdown-toggle')].map(e => new bootstrap.Dropdown(e));

function GetCheckedBoxIDs() {
    return Array.from(document.querySelectorAll('input[type="checkbox"].list-check-box:checked')).map(c => c.value);
}

// 목록 버튼상자
class ActionButtons {
    constructor() {
        this.form = document.getElementById("fAdminList");
    }

    validate() {
        let checked = $("input:checkbox.list-check-box:checked");
        if (checked.length < 1) {
            alert("항목을 하나 이상 선택하세요.");
            return false;
        }
        return true;
    }

    checkout(e, action)
    {
        let handler = "";

        switch (action) {
            case "Restore":
                handler = "?handler=Restore";
                break;
            case "Delete":
                handler = "?handler=Delete";
                break;
            case "Update":
                handler = "?handler=Update";
                break;
        }

        if (handler) {
            this.form.action = handler;
        }

        this.form.submit();
    }

    Update(e) {
        if (!this.validate()) {
            return false;
        }

        if (confirm("선택한 항목을 정말 수정 하시겠습니까?")) {
            this.checkout(e, "Update");
        }
    }

    Delete(e) {
        let ids = GetCheckedBoxIDs();

        if (ids.length > 1) {
            if (confirm(`${ids.length}건의 항목을 정말 삭제 하시겠습니까?`)) {
                if (!this.validate()) {
                    return false;
                }
            }
        } else {
            if (!confirm("선택한 항목을 정말 삭제 하시겠습니까?")) {
                return false;
            }

            let id = e.target.dataset.id;
            if (id) {
                this.form.elements[`ids_${id}`].checked = true;
            }
        }

        setTimeout(() => this.checkout(e, "Delete"), 100);
    }

    Restore(e) {
        if (!this.validate()) {
            return false;
        }

        if (confirm("선택한 항목을 정말 복원 하시겠습니까?")) {
            this.checkout(e, "Restore");
        }
    }

    checkedAll(e) {
        let chk = document.getElementsByClassName("list-check-box");
        for (let i = 0; i < chk.length; i++) {
            let targetFormName = (e.target.getAttribute("form") || e.target.form.id);
            let chkFormName = (chk[i].getAttribute("form") || chk[i].form.id);

            if (targetFormName == chkFormName) {
                chk[i].checked = e.target.checked;
            }
        }

        this.toggleDisabled();
    }

    toggleDisabled() {
        let checked = $("input:checkbox.list-check-box:checked");
        if (checked.length > 0) {
            $('button[form="fAdminList"]').prop("disabled", false);
        } else {
            $('button[form="fAdminList"]').prop("disabled", true);
        }
    }
}

const actionButtons = new ActionButtons();
$(document).on("click", "#btnListUpdate", (e) => actionButtons.Update(e));
$(document).on("click", "#btnListDelete", (e) => actionButtons.Delete(e));
$(document).on("click", "#btnListRestore", (e) => actionButtons.Restore(e));
$(document).on("click", "#btnListExecute", (e) => actionButtons.Execute(e));
$(document).on("click", ".btn-row-delete", (e) => actionButtons.Delete(e));
$(document).on("click", "#checkedAll", (e) => actionButtons.checkedAll(e));
$(document).on("change", "input.list-check-box", actionButtons.toggleDisabled);