/**
 * 카테고리 Depth 4 팝업 스크립트 (약품 관리 그리드 포함)
 */
$(document).ready(function () {
    const params = new URLSearchParams(window.location.search);
    const mode = params.get('mode');
    const pid = params.get('pid');
    const diviDept = params.get('diviDept');
    const diviParent = params.get('diviParent');
    const parentName = params.get('parentName');

    var productTable = null;      // Tabulator 인스턴스
    var searchResultTable = null; // 검색결과 Tabulator 인스턴스
    var unitCodeCache = [];       // 단위 코드 캐시

    loadUnitCodes(null, function () {
        initForm();
    });
    bindEvents();

    // ====== 금액 포맷팅 ======
    function formatNumber(num) {
        if (!num) return '0';
        return num.toString().replace(/[^0-9]/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }

    function unformatNumber(str) {
        if (!str) return 0;
        return parseFloat(str.toString().replace(/,/g, '')) || 0;
    }

    // ====== 공통코드 단위 로드 ======
    function loadUnitCodes(selectedVal, callback) {
        $.ajax({
            url: '/settings/code/getCodeList.do',
            type: 'POST',
            data: { grpCd: 'UNIT_CD', storePid: '1' },
            success: function (res) {
                if (res.msgCode === '0' && res.rows) {
                    unitCodeCache = res.rows;

                    // 메인 단위 셀렉트 세팅
                    var $sel = $('#kindUnit');
                    $sel.find('option:not(:first)').remove();

                    $.each(res.rows, function (i, item) {
                        $sel.append('<option value="' + item.code_cd + '">' + item.code_nm + '</option>');
                    });

                    if (selectedVal) {
                        $sel.val(selectedVal);
                    }
                }
                if (typeof callback === 'function') callback();
            },
            error: function () {
                console.error('단위 코드 목록 로드 실패');
                if (typeof callback === 'function') callback();
            }
        });
    }

    // 단위코드 → 단위명 변환 헬퍼
    function getUnitName(unitCd) {
        if (!unitCd) return '';
        for (var i = 0; i < unitCodeCache.length; i++) {
            if (unitCodeCache[i].code_cd === unitCd) return unitCodeCache[i].code_nm;
        }
        return unitCd;
    }

    // ====== 폼 초기화 ======
    function initForm() {
        if (mode === 'add') {
            $("#popTitle").text('용량/출력 신규 등록');
            $("#pid").val('');
            $("#diviParent").val(diviParent);
            $("#btn_delete").hide();
            $("#productSection").show();
            $("#btn_add_product").prop('disabled', true).css('opacity', '0.5');
            initProductGrid();
            // 저장 전 안내 placeholder
            if (productTable) {
                productTable.options.placeholder = "카테고리 저장 후 약품을 추가할 수 있습니다.";
                productTable.setData([]);
            }

            if (diviParent !== '0' && parentName) {
                $("#parentNameRow").show();
                $("#parentNameTxt").text(parentName);
            }
        } else if (mode === 'edit') {
            $("#popTitle").text('용량/출력 정보 수정');
            $("#pid").val(pid);
            $("#btn_delete").show();
            $("#productSection").show();
            loadDetail(pid);
            initProductGrid();
        }
    }

    // ====== 상세 정보 로드 ======
    function loadDetail(id) {
        $.ajax({
            url: '/settings/medicalCategory/getMedicalCategory.do',
            type: 'POST',
            data: { pid: id },
            success: function (res) {
                if (res.msgCode === '0') {
                    const data = res.data;
                    $("#diviParent").val(data.divi_parent);
                    $("#diviName").val(data.divi_name);
                    $("#diviSort").val(data.divi_sort);
                    $("#diviColor").val(data.divi_color || '#000000');

                    $("#kindCost").val(formatNumber(data.kind_cost));
                    $("#dcCost").val(formatNumber(data.dc_cost));
                    $("#kindUnitVol").val(data.kind_unit_vol || 0);

                    loadUnitCodes(data.kind_unit || '');

                    if (data.parent_name) {
                        $("#parentNameRow").show();
                        $("#parentNameTxt").text(data.parent_name);
                    } else if (parentName) {
                        $("#parentNameRow").show();
                        $("#parentNameTxt").text(parentName);
                    }
                } else {
                    alert("정보를 불러올 수 없습니다.");
                    window.close();
                }
            },
            error: function () {
                alert("상세 정보 조회 통신 오류");
                window.close();
            }
        });
    }

    // ====== 약품 그리드 초기화 ======
    function initProductGrid() {
        // 단위코드 셀렉트용 values 생성 (배열: 정렬 보장)
        var unitValuesMap = {};
        unitValuesMap[''] = '선택';

        // code_cd 오름차순 정렬
        var sortedUnits = unitCodeCache.slice().sort(function (a, b) {
            return (a.code_cd || '').localeCompare(b.code_cd || '');
        });

        var unitSelectValues = [{ label: '선택', value: '' }];
        for (var i = 0; i < sortedUnits.length; i++) {
            unitSelectValues.push({ label: sortedUnits[i].code_nm, value: sortedUnits[i].code_cd });
            unitValuesMap[sortedUnits[i].code_cd] = sortedUnits[i].code_nm;
        }

        productTable = new Tabulator("#productGrid", {
            layout: "fitColumns",
            placeholder: "등록된 약품이 없습니다.",
            height: "200px",
            columnDefaults: {
                headerHozAlign: "center",
                headerSort: false,
                tooltip: true
            },
            columns: [
                { title: "거래처", field: "company_name", width: 90, hozAlign: "center" },
                { title: "약품명", field: "product_name", minWidth: 120 },
                {
                    title: "재고", field: "stock_quantity", width: 65, hozAlign: "right"
                },
                { title: "재고단위", field: "stock_unit_nm", width: 70, hozAlign: "center" },
                {
                    title: "사용량", field: "use_volume", width: 70, hozAlign: "right",
                    editor: "number",
                    editorParams: { step: 0.1, min: 0 },
                    formatter: function (cell) {
                        var v = cell.getValue();
                        return (v && Number(v) > 0) ? Number(v).toFixed(1) : '0';
                    },
                    cssClass: "editable-cell"
                },
                {
                    title: "사용단위", field: "unit_cd", width: 80, hozAlign: "center",
                    editor: "list",
                    editorParams: { values: unitSelectValues, defaultValue: '' },
                    formatter: function (cell) {
                        var val = cell.getValue();
                        if (!val || val === '') return '선택';
                        if (unitValuesMap[val]) return unitValuesMap[val];
                        // CRM 코드에 없으면 unit_nm(단위명) 표시
                        var rowData = cell.getRow().getData();
                        return rowData.unit_nm || '선택';
                    },
                    cssClass: "editable-cell"
                },
                {
                    title: "삭제", width: 45, hozAlign: "center",
                    formatter: function () {
                        return '<span style="color:#ff4444; cursor:pointer; font-weight:600;">✕</span>';
                    },
                    cellClick: function (e, cell) {
                        e.stopPropagation();
                        var data = cell.getRow().getData();
                        if (!confirm("'" + data.product_name + "' 약품을 삭제하시겠습니까?")) return;
                        deleteProduct(data.pid, cell.getRow());
                    }
                }
            ]
        });

        // 셀 수정 시 자동 저장
        productTable.on("cellEdited", function (cell) {
            var data = cell.getRow().getData();
            var field = cell.getField();

            var updateObj = { pid: data.pid };

            if (field === 'use_volume') {
                updateObj.useVolume = parseFloat(data.use_volume || 0);
            } else if (field === 'unit_cd') {
                updateObj.unitCd = data.unit_cd || '';
                updateObj.unitNm = getUnitName(data.unit_cd);
            }

            $.ajax({
                url: '/settings/medicalCategory/modDiviProduct.do',
                type: 'POST',
                contentType: 'application/json',
                data: JSON.stringify(updateObj),
                success: function (res) {
                    if (res.msgCode !== '0') {
                        alert(res.msgDesc || "수정에 실패했습니다.");
                        loadProductList();
                    }
                },
                error: function () {
                    alert("수정 중 오류가 발생했습니다.");
                    loadProductList();
                }
            });
        });

        // 그리드 데이터 로드
        loadProductList();
    }

    // ====== 약품 리스트 로드 ======
    function loadProductList() {
        if (!pid) return;
        $.ajax({
            url: '/settings/medicalCategory/getDiviProductList.do',
            type: 'POST',
            data: { diviPid: pid, storePid: '1' },
            success: function (res) {
                if (res.msgCode === '0' && productTable) {
                    productTable.setData(res.rows || []);
                }
            },
            error: function () {
                console.error('약품 리스트 로드 실패');
            }
        });
    }

    // ====== 약품 등록 (검색 팝업에서 선택 시 호출) ======
    function selectAndAddProduct(productData) {
        if (!productData) return;

        var submitObj = {
            storePid: $("#storePid").val(),
            diviPid: pid,
            productName: productData.productName || '',
            productCode: productData.muProductId || '',
            volume: parseFloat(productData.volume || '0'),
            useVolume: 0,
            unitCd: null,
            unitNm: null,
            price: parseInt((productData.price || '0').toString().replace(/,/g, ''), 10),
            orderNumber: 0
        };

        $.ajax({
            url: '/settings/medicalCategory/putDiviProduct.do',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(submitObj),
            success: function (res) {
                if (res.msgCode === '0') {
                    loadProductList();
                    closeProductSearchPopup();
                } else {
                    alert(res.msgDesc || "등록에 실패했습니다.");
                }
            },
            error: function () {
                alert("약품 등록 중 오류가 발생했습니다.");
            }
        });
    }

    // ====== 약품 삭제 ======
    function deleteProduct(productPid, row) {
        $.ajax({
            url: '/settings/medicalCategory/delDiviProduct.do',
            type: 'POST',
            data: { pid: productPid },
            success: function (res) {
                if (res.msgCode === '0') {
                    loadProductList();
                } else {
                    alert(res.msgDesc || "삭제에 실패했습니다.");
                }
            },
            error: function () {
                alert("약품 삭제 중 오류가 발생했습니다.");
            }
        });
    }

    // ====== 제품 검색 팝업 열기 ======
    function openProductSearchPopup() {
        $("#searchProductKeyword").val('');
        $("#productSearchOverlay").addClass('active');
        initSearchResultGrid();
        // 팝업 열릴 때 전체 목록 바로 조회
        searchProducts();
        setTimeout(function () {
            $("#searchProductKeyword").focus();
        }, 200);
    }

    // ====== 제품 검색 팝업 닫기 ======
    function closeProductSearchPopup() {
        $("#productSearchOverlay").removeClass('active');
    }

    // ====== 검색 결과 그리드 초기화 ======
    function initSearchResultGrid() {
        if (searchResultTable) return; // 이미 초기화됨

        searchResultTable = new Tabulator("#searchResultGrid", {
            layout: "fitColumns",
            placeholder: "검색 결과가 없습니다.",
            height: "300px",
            columnDefaults: {
                headerHozAlign: "center",
                headerSort: true,
                tooltip: true
            },
            columns: [
                { title: "No", formatter: "rownum", width: 35, hozAlign: "center", headerSort: false },
                { title: "재고구분", field: "treatmentName", width: 90, hozAlign: "center" },
                { title: "거래처", field: "companyName", width: 100 },
                {
                    title: "제품명", field: "productName", minWidth: 140,
                    formatter: function (cell) {
                        return '<span style="color:#3985EA; cursor:pointer; font-weight:600;">' + (cell.getValue() || '') + '</span>';
                    },
                    cellClick: function (e, cell) {
                        e.stopPropagation();
                        var data = cell.getRow().getData();
                        if (confirm("'" + data.productName + "' 제품을 약품으로 추가하시겠습니까?")) {
                            selectAndAddProduct(data);
                        }
                    }
                },
                {
                    title: "용량", field: "volume", width: 60, hozAlign: "right",
                    formatter: function (cell) {
                        var v = cell.getValue();
                        return (v && Number(v) > 0) ? Number(v).toFixed(1) : '';
                    }
                },
                { title: "단위", field: "unitName", width: 55, hozAlign: "center" },
                {
                    title: "단가(원)", field: "price", width: 80, hozAlign: "right"
                },
                {
                    title: "재고", field: "quantity", width: 60, hozAlign: "right"
                }
            ]
        });
    }

    // ====== 제품 검색 실행 ======
    function searchProducts() {
        var keyword = $.trim($("#searchProductKeyword").val());

        $.ajax({
            url: '/settings/medicalCategory/searchProductList.do',
            type: 'POST',
            data: { keyword: keyword },
            success: function (res) {
                if (res.msgCode === '0' && searchResultTable) {
                    searchResultTable.setData(res.rows || []);
                } else {
                    if (searchResultTable) searchResultTable.setData([]);
                }
            },
            error: function () {
                alert("제품 검색 중 오류가 발생했습니다.");
            }
        });
    }

    // ====== 이벤트 바인딩 ======
    function bindEvents() {
        $("#btn_close").on("click", function () {
            window.close();
        });

        $("#btn_save").on("click", function () {
            saveCategory();
        });

        $("#btn_delete").on("click", function () {
            deleteCategory();
        });

        // 금액 콤마 자동 입력
        $("#kindCost, #dcCost").on("keyup", function () {
            $(this).val(formatNumber($(this).val()));
        });

        // 약품 추가 (검색 팝업 열기)
        $("#btn_add_product").on("click", function () {
            openProductSearchPopup();
        });

        // 검색 팝업 닫기
        $("#btn_close_search").on("click", function () {
            closeProductSearchPopup();
        });

        // 오버레이 클릭 시 닫기
        $("#productSearchOverlay").on("click", function (e) {
            if (e.target === this) closeProductSearchPopup();
        });

        // 검색 버튼
        $("#btn_search_product").on("click", function () {
            searchProducts();
        });

        // 검색 Enter 키
        $("#searchProductKeyword").on("keydown", function (e) {
            if (e.keyCode === 13) {
                e.preventDefault();
                searchProducts();
            }
        });
    }

    // ====== 카테고리 저장 ======
    function saveCategory() {
        const dName = $("#diviName").val().trim();
        if (!dName) {
            alert("용량/출력 명칭을 입력하세요.");
            $("#diviName").focus();
            return;
        }

        const submitObj = {
            pid: $("#pid").val() || null,
            storePid: $("#storePid").val(),
            diviName: dName,
            diviDept: $("#diviDept").val(),
            diviParent: $("#diviParent").val(),
            diviSort: parseInt($("#diviSort").val() || "0", 10),
            diviColor: $("#diviColor").val(),
            kindCost: unformatNumber($("#kindCost").val()),
            dcCost: unformatNumber($("#dcCost").val()),
            kindUnit: $("#kindUnit").val(),
            kindUnitVol: parseFloat($("#kindUnitVol").val() || "0")
        };

        const targetUrl = mode === 'edit' ? '/settings/medicalCategory/modMedicalCategory.do' : '/settings/medicalCategory/putMedicalCategory.do';

        $.ajax({
            url: targetUrl,
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(submitObj),
            success: function (res) {
                alert(res.msgDesc);
                if (res.msgCode === '0') {
                    if (window.opener && typeof window.opener.loadData === 'function') {
                        window.opener.loadData(true);
                    }
                    // 신규 등록 후 수정 모드로 전환하여 약품 관리 가능하게
                    if (mode === 'add' && res.pid) {
                        window.location.href = window.location.pathname +
                            '?mode=edit&pid=' + res.pid +
                            '&diviDept=' + diviDept +
                            '&diviParent=' + diviParent +
                            '&parentName=' + encodeURIComponent(parentName || '');
                    } else {
                        window.close();
                    }
                }
            },
            error: function () {
                alert("저장 중 시스템 오류가 발생했습니다.");
            }
        });
    }

    // ====== 카테고리 삭제 ======
    function deleteCategory() {
        const pidVal = $("#pid").val();
        if (!pidVal) return;
        if (!confirm("해당 카테고리를 삭제하시겠습니까?\n하위 항목이 있을 경우 삭제되지 않습니다.")) return;

        $.ajax({
            url: '/settings/medicalCategory/delMedicalCategory.do',
            type: 'POST',
            data: { pid: pidVal },
            success: function (res) {
                alert(res.msgDesc);
                if (res.msgCode === '0') {
                    if (window.opener && typeof window.opener.loadData === 'function') {
                        window.opener.loadData(true);
                    }
                    window.close();
                }
            },
            error: function () {
                alert("삭제 중 시스템 오류가 발생했습니다.");
            }
        });
    }
});
