/* 페이징 관련 변수 */
let webCategoryTotalCount   = 0;
let webCategoryTotalPages   = 0;

/*aggird*/
let webCategoryAgGridData = [];

/* 삭제할 항목들 */
let delList = [];

/* 등록 버튼 이중 클릭 방지 플래그 */
let isInsertBtnDisabled = false;

/****************************************************************************
 * 카테고리 정보 리스트 조회
 ****************************************************************************/
function fn_selectListwebCategoryJson(){
    let formData = new FormData();
	formData.append("menuClass", menuClass);
    // gridSort에 categoryNm가 들어오면 CATEGORY_NM로 변환
    let sortValue = webCategorySort;
    if (sortValue && sortValue.indexOf('categoryNm') !== -1) {
        sortValue = sortValue.replace(/categoryNm/g, 'CATEGORY_NM');
    }
    formData.append("gridSort", sortValue);
    formData.append("gridLimitStart", webCategoryStart || 0);
    formData.append("gridLimitEnd", webCategoryLimit || 10);
    formData.append("categoryDivCd", categoryDivCd);
    formData.append("categoryNm", categoryNm);
	formData.append("searchCategoryDivCd", $("#searchCategoryDivCd").val());
	formData.append("searchCategoryNm", $("#searchCategoryNm").val());

    $.ajax({
        url: encodeURI('/categoryManagement/getCategoryManagementList.do'),
        data: formData,
        dataType: "json",
        processData: false,
        contentType: false,
        type: 'POST',
        async: true,
        success: function(data){
            if('0'==data.msgCode){
                // 페이징 처리
                webCategoryTotalCount  = data.totalCount;
                //$("#txt_noticeTotalCount").text(noticeTotalCount);

                webCategoryTotalPages = Math.ceil(webCategoryTotalCount/webCategoryLimit);

                // 리스트 조회
                webCategoryAgGridData = data.rows;
                webCategoryGridOptions.api.setRowData(webCategoryAgGridData);

                if(0<data.rows.length){
                    //페이징 처리
                    window.pagObj = $('#webCategoryPagination').twbsPagination({
                        startPage    : ((webCategoryStart/webCategoryLimit)+1),
                        totalPages   : (webCategoryTotalPages==0)?1:webCategoryTotalPages,
                        visiblePages : 10,
                        initiateStartPageClick: false,
                        prev         : '<img src="/image/web/page_navigation_arrow.svg" alt="prev"/>',
                        next         : '<img src="/image/web/page_navigation_arrow.svg" alt="next"/>',
                        first        : '',
                        last         : '',
                        onPageClick: function (Category, page) {
                            fn_webCategoryPagination(page);
                        }
                    }).on('page', function (Category, page) {
                        //console.info(page + ' (from Category listening)');
                    });
                }
                else{

                }
            }
            else{
                modalEvent.danger("조회 오류", data.msgDesc);
            }
        },
        error : function(xhr, status, error) {
            modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.");
        },
        beforeSend:function(){
            // 로딩열기
            webCategoryGridOptions.api.showLoadingOverlay();
        },
        complete:function(){

        }
    });
}

/****************************************************************************
 * 검색하기
 ****************************************************************************/
function fn_webCategorySearch(param){
    if("A"!=param && "Y"!=selectUseYn){
        modalEvent.warning("", "조회 권한이 없습니다.");
        return false;
    }

    fn_webCategoryPaginReset();

	categoryDivCd = $("#searchCategoryDivCd").val();
    categoryNm = $("#searchCategoryNm").val();

    fn_selectListwebCategoryJson();
}


/****************************************************************************
 * 초기화하기
 ****************************************************************************/
function fn_webCategoryReset(){
	$("#searchCategoryDivCd").val("");
    $("#searchCategoryNm").val("");
    fn_webCategorySearch();
}

/****************************************************************************
 * 페이징 처리
 ****************************************************************************/
function fn_webCategoryPagination(param){
    webCategoryStart = (parseInt(param)-1)*webCategoryLimit;

    fn_selectListwebCategoryJson();
}

/****************************************************************************
 * 페이징 리셋
 ****************************************************************************/
function fn_webCategoryPaginReset(){
    branchOfficeCd = '';
	mbName = '';
	mbHp = '';
	opinionClassificationCd = '';

    webCategoryStart        = 0;
    webCategoryLimit        = 100;
    webCategoryTotalCount   = 0;
    webCategoryTotalPages   = 0;

    //페이징 초기화
    if($("#webCategoryPagination").data("twbs-pagination")){
        $("#webCategoryPagination").twbsPagination("destroy");
    }
}

/****************************************************************************
 * 검색 엔터 카테고리
 ****************************************************************************/
function fn_webCategoryEnter(e){
    if(e.which){
        // 파이어폭스
        if(13 == e.which) {
            //로그인 액션 스크립트
            fn_webCategorySearch();
        }
    }
    else{
        // 윈도우, 사파리, 크롬
        if(13 == Category.keyCode) {
            //로그인 액션 스크립트
            fn_webCategorySearch();
        }
    }
}

/****************************************************************************
 * 완료
 ****************************************************************************/
function fn_webCategoryOk(){
    isInsertBtnDisabled = false;
    $("#btnInsertWebCategory").prop('disabled', false);
    fn_webCategoryReset();
}
// JavaScript
// Category division options
let categoryDivOptions = [
    { value: "01", label: "다이어트 시술" },
    { value: "02", label: "다이어트 이벤트" },
	{ value: "03", label: "쁘띠 시술" },
    { value: "04", label: "쁘띠 이벤트" },
    { value: "05", label: "다이어트 전후사진" },
    { value: "06", label: "쁘띠 전후사진" }
];


let webCategoryColumnDefs = [
    {field: "checkbox", headerName:"", minWidth:55, maxWidth:55, headerCheckboxSelection: true, checkboxSelection: true},
    {
        field: "categoryDivCd",
        headerName: "카테고리구분",
        minWidth: 150,
        maxWidth: 200,
        cellStyle: {
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center'
        },
        cellRenderer: function(params) {
            let found = categoryDivOptions.find(opt => opt.value === params.value);
            return found ? found.label : params.value;
        },
        // Make editable only for new rows (regDate is empty)
        editable: function(params) {
            // 신규행(regDate 없음)이고 등록중 플래그가 있거나, 둘 중 하나라도 값이 없으면 false
            if (!params.data.regDate) {
                if (params.data._isRegistering) return false;
                // 둘 중 하나라도 값이 없으면(입력 중)만 true, 둘 다 값이 있으면 false
                if (!params.data.categoryDivCd || !params.data.categoryNm) return true;
                return false;
            }
            // 다른 행: 그리드에 신규행이 있고, 그 신규행이 입력 중이거나 등록중이면 수정 불가
            let rowData = [];
            params.api.forEachNode(function(node) {
                rowData.push(node.data);
            });
            let hasNewRowEditing = rowData.some(row => !row.regDate && (!row.categoryDivCd || !row.categoryNm || row._isRegistering));
            if (hasNewRowEditing) return false;
            return true;
        },
        cellEditor: 'agSelectCellEditor',
        cellEditorParams: {
            values: categoryDivOptions.map(opt => opt.label)
        },
        valueSetter: function(params) {
            let found = categoryDivOptions.find(opt => opt.label === params.newValue);
            if (found) {
                params.data.categoryDivCd = found.value;
                return true;
            }
            return false;
        }
    },
    {
        field: "categoryNm",
        headerName: "카테고리명",
        minWidth: 200,
        maxWidth: 300,
        cellStyle: {
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center'
        },
        // 신규행이 등록중이거나 입력이 덜 된 경우 수정 불가
        editable: function(params) {
            // 신규행: 입력(값이 없을 때)만 가능, 입력이 끝나면(둘 다 값이 있으면) 수정 불가, 등록중에도 수정 불가
            if (!params.data.regDate) {
                if (params.data._isRegistering) return false;
                // 둘 중 하나라도 값이 없으면 true(입력 가능), 둘 다 값이 있으면 false(수정 불가)
                if (!params.data.categoryDivCd || !params.data.categoryNm) return true;
                return false;
            }
            // 신규행이 등록중이거나 입력 중이면 다른 행은 수정 불가
            let rowData = [];
            params.api.forEachNode(function(node) {
                rowData.push(node.data);
            });
            let hasNewRowEditing = rowData.some(row => !row.regDate && (!row.categoryDivCd || !row.categoryNm || row._isRegistering));
            if (hasNewRowEditing) return false;
            return true;
        }
    },
    { field: "regDate", headerName:"등록일", minWidth: 130, maxWidth: 150, editable: false,
        cellStyle: {
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center'
        },
    }
];

// let the grid know which columns and what data to use
let webCategoryGridOptions = {
    suppressRowTransform: true,
    columnDefs: webCategoryColumnDefs,
    defaultColDef: {		// 리스트 기본 설정
        flex: 1,
        sortable: true,		//정렬 여부
        resizable: true,	//리사이즈
        cellStyle:{
					textAlign:'left',
					fontSize:'14px',
					lineHeight:'16px', 
					whiteSpace:'normal', 
					padding:'0'
				  },
        //suppressSizeToFit:true,		//자동 맞춤
        //enableRowGroup: true,		// 그룹 묶음
        enablePivot: true,
        enableValue : true,
		wrapText: true,       // 텍스트 줄바꿈
		autoHeight: true
    },
    //suppressMultiSort:true,  //단일솔트 true가 단일, false가 다중 shift + sort 시
    headerHeight : 41, // header 높이
    //rowHeight : 41, // row 높이
    rowData : webCategoryAgGridData,
    suppressRowClickSelection : true, // 로우 클릭시 체크박스 선택 true no, false yes
    localeText : {
        noRowsToShow : '조회 결과가 없습니다.'
    }, //데이터 없을 시 나오는 문구
    rowSelection : 'multiple', // row 다중 선택
    debug : false,
    onSelectionChanged: function(Category){
        delList = Category.api.getSelectedRows();
    },
    onSortChanged: function(Category){
        //정렬
        webCategorySort = ''; //기존 정렬 초기화
        let columnArr = Category.columnApi.getColumnState();
        if(0<columnArr.length){
            //sort index 순으로 재정렬
            columnArr.sort(function(a,b){
                return a.sortIndex - b.sortIndex;
            });

            let nullCnt = 0;
            for(let i=0; i<columnArr.length; i++){
                let gridSortModel = columnArr[i].colId;
                let gridSort = columnArr[i].sort;

                if(gridSort != null){
                    webCategoryStart = 0;
                    webCategorySort += gridSortModel+' '+ gridSort + ',';
                }
                else{
                    nullCnt++;
                    if(nullCnt == columnArr.length){
                        webCategorySort = '';
                        webCategoryDir = '';
                        webCategoryStart = 0;
                    }
                }
            }
        }
        webCategorySort = webCategorySort.substring(0,webCategorySort.lastIndexOf( ",")); //맨끝 콤마 지우기

        fn_webCategorySearch();
    },
	onCellValueChanged: function(event) {
    // 신규 row: regDate가 없을 때, 둘 다 값이 있어야 등록
    if (!event.data.regDate) {
        if (event.data.categoryDivCd && event.data.categoryNm) {
            // 등록중 플래그 설정
            event.data._isRegistering = true;
            event.api.refreshCells({ force: true }); // 색상 즉시 반영
            let data = {
                categoryDivCd: event.data.categoryDivCd,
                categoryNm: event.data.categoryNm,
                menuClass: menuClass
            };
            $.ajax({
                url: '/categoryManagement/putCategoryManagement.do',
                type: 'POST',
                data: JSON.stringify(data),
                contentType: 'application/json',
                success: function(res) {
                    if (typeof res === 'string') {
                        try {
                            res = JSON.parse(res);
                        } catch (e) {
                            modalEvent.danger('등록 오류', '서버 응답 파싱 오류');
                            event.data._isRegistering = false;
                            return;
                        }
                    }
                    if (res.msgCode === '0') {
                        modalEvent.success('등록 완료', '카테고리가 등록되었습니다.', function(){
                            fn_webCategoryOk();
                        });
                    } else {
                        modalEvent.danger('등록 오류', res.msgDesc);
                    }
                    event.data._isRegistering = false;
                    event.api.refreshCells({ force: true }); // 색상 즉시 반영
                },
                error: function() {
                    modalEvent.danger('등록 오류', '등록 중 오류가 발생하였습니다.');
                    event.data._isRegistering = false;
                    event.api.refreshCells({ force: true }); // 색상 즉시 반영
                }
            });
        } else {
            // 둘 중 하나라도 없으면 등록/수정 불가, 아무 동작 안함
            return;
        }
    } else {
        // 기존 row 수정: 둘 다 값이 있을 때만 수정
        if (event.data.categoryDivCd && event.data.categoryNm) {
            let updatedData = { ...event.oldData, ...event.data };
            updatedData.menuClass = menuClass;
            $.ajax({
                url: '/categoryManagement/modCategoryManagement.do',
                type: 'POST',
                data: JSON.stringify(updatedData),
                contentType: 'application/json',
                success: function(res) {
                    response = JSON.parse(res);
                    if (response.msgCode === '0') {
                        modalEvent.success('수정 완료', '수정이 성공적으로 반영되었습니다.');
                        fn_selectListwebCategoryJson();
                    } else {
                        modalEvent.danger('수정 오류', response.msgDesc);
                    }
                },
                error: function() {
                    modalEvent.danger('수정 오류', '수정 중 오류가 발생하였습니다.');
                }
            });
        } else {
            // 둘 중 하나라도 없으면 수정 불가, 아무 동작 안함
            return;
        }
    }
	},
    getRowStyle: function(params) {
        return null; // 색상은 CSS에서 처리
    },
    getRowClass: function(params) {
        if (!params.data) return '';
        if (!params.data.regDate && params.data._isRegistering) {
            return 'registering-row';
        }
        if (!params.data.regDate) {
            return 'new-row';
        }
        return '';
    }
};

// lookup the container we want the Grid to use
let webCategoryGridDiv = document.querySelector('#webCategoryGrid');

// create the grid passing in the div to use together with the columns & data we want to use
new agGrid.Grid(webCategoryGridDiv, webCategoryGridOptions);


/****************************************************************************
 * 페이지 init
 ****************************************************************************/
function fn_pageInit(){
    // 초기 페이징 처리
	$("#searchCategoryDivCd").val(categoryDivCd);
    $("#searchCategoryNm").val(categoryNm);
    fn_webCategorySearch("A");
}

/****************************************************************************
 * 페이지 Category
 ****************************************************************************/
function fn_pageCategory(){
	$(document).on('keypress', '#searchCategoryDivCd', function(e) {
        fn_webCategoryEnter(e);
    });
    $(document).on('keypress', '#searchCategoryNm', function(e) {
        fn_webCategoryEnter(e);
    });

    $("#btnSearchWebCategory").click(function () {
        fn_webCategorySearch();
    });

    $("#btnInsertWebCategory").click(function () {
        if (isInsertBtnDisabled) return;
        isInsertBtnDisabled = true;
        $(this).prop('disabled', true);
        fn_insertwebCategoryIntro();
        // 등록 완료 또는 실패 시 다시 활성화 (fn_webCategoryOk에서 처리)
    });
    $("#btnDeleteWebCategory").click(function () {
        fn_deleteWebCategory();
    });
}

// 카테고리 등록 모달 열기
function fn_insertwebCategoryIntro() {
    if("Y"==insertUseYn){
        // 그리드에 한 줄 추가
        let newRow = {
            categoryDivCd: '',
            categoryNm: '',
            regDate: ''
        };
        webCategoryGridOptions.api.applyTransaction({ add: [newRow], addIndex: 0 });
        // 첫 번째 row, 카테고리구분 셀에 포커스
        setTimeout(function() {
            webCategoryGridOptions.api.startEditingCell({
                rowIndex: 0,
                colKey: 'categoryDivCd'
            });
        }, 100);
    } else {
        modalEvent.warning('', '등록 권한이 없습니다.');
        return false;
    }
}

// 카테고리 삭제
function fn_deleteWebCategory() {
    // 신규행이 등록중이거나 입력 중이면 삭제 불가
    let rowData = [];
    webCategoryGridOptions.api.forEachNode(function(node) {
        rowData.push(node.data);
    });
    let hasNewRowEditing = rowData.some(row => !row.regDate && (!row.categoryDivCd || !row.categoryNm || row._isRegistering));
    if (hasNewRowEditing) {
        modalEvent.warning('', '신규 카테고리 등록이 완료되기 전에는 삭제할 수 없습니다.');
        return;
    }
    if(!delList || delList.length === 0) {
        modalEvent.warning('', '삭제할 카테고리를 선택하세요.');
        return;
    }
    modalEvent.info('삭제', '선택한 카테고리를 삭제하시겠습니까?', function(){
        let data = {
            menuClass: menuClass,
            delList: delList
        };
        $.ajax({
            url: '/categoryManagement/delCategoryManagement.do',
            data: JSON.stringify(data),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            type: 'POST',
            async: true,
            success: function(res){
                if(res.msgCode === '0'){
                    modalEvent.success('삭제 완료', '카테고리가 삭제되었습니다.', function(){
                        fn_webCategoryOk();
                    });
                } else {
                    modalEvent.danger('삭제 오류', res.msgDesc);
                }
            },
            error: function(xhr, status, error) {
                modalEvent.danger('삭제 오류', '삭제 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.');
            }
        });
    });
}

$(function(){
    // 페이지 init
    fn_pageInit();

    // 페이지 Category
    fn_pageCategory();
});