/* 페이징 관련 변수 */
let webFeedbackTotalCount   = 0;
let webFeedbackTotalPages   = 0;

/*aggird*/
let webFeedbackAgGridData = [];

/****************************************************************************
 * 칭찬불만접수 정보 리스트 조회
 ****************************************************************************/
function fn_selectListwebFeedbackJson(){
    let formData = new FormData();
    formData.append("menuClass", menuClass);
    formData.append("gridSort", webFeedbackSort);
    formData.append("gridLimitStart", 0);
    formData.append("gridLimitEnd", 10);
    formData.append("branchOfficeCd", branchOfficeCd);
    formData.append("mbName", mbName);
    formData.append("mbHp", mbHp);
    formData.append("opinionClassificationCd", opinionClassificationCd);

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

                webFeedbackTotalPages = Math.ceil(webFeedbackTotalCount/webFeedbackLimit);

                // 리스트 조회
                webFeedbackAgGridData = data.rows;
                webFeedbackGridOptions.api.setRowData(webFeedbackAgGridData);

                if(0<data.rows.length){
                    //페이징 처리
                    window.pagObj = $('#webFeedbackPagination').twbsPagination({
                        startPage    : ((webFeedbackStart/webFeedbackLimit)+1),
                        totalPages   : (webFeedbackTotalPages==0)?1:webFeedbackTotalPages,
                        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 (Feedback, page) {
                            fn_webFeedbackPagination(page);
                        }
                    }).on('page', function (Feedback, page) {
                        //console.info(page + ' (from Feedback listening)');
                    });
                }
                else{

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

        }
    });
}

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

    fn_webFeedbackPaginReset();

	// Convert branchOfficeCd
    let branchOfficeInput = $("#branchOfficeCd").val();
    branchOfficeCd = branchOfficeInput === "강남" ? "GN" : branchOfficeInput;

    mbName = $("#mbName").val();
    mbHp = $("#mbHp").val();

    // Convert opinionClassificationCd
    let opinionInput = $("#opinionClassificationCd").val();
    switch(opinionInput) {
        case "칭찬": opinionClassificationCd = "PR"; break;
        case "불만": opinionClassificationCd = "DS"; break;
        case "기타": opinionClassificationCd = "ET"; break;
        default: opinionClassificationCd = opinionInput;
    }

    fn_selectListwebFeedbackJson();
}


/****************************************************************************
 * 초기화하기
 ****************************************************************************/
function fn_webFeedbackReset(){
    $("#webFeedbackSearchDateType option:eq(0)").prop("selected", true);

    $("#branchOfficeCd").val("");
	$("#mbName").val("");
	$("#mbHp").val("");
	$("#opinionClassificationCd").val("");

    fn_webFeedbackSearch();
}

/****************************************************************************
 * 페이징 처리
 ****************************************************************************/
function fn_webFeedbackPagination(param){
    webFeedbackStart = (parseInt(param)-1)*webFeedbackLimit;

    fn_selectListwebFeedbackJson();
}

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

    webFeedbackStart        = 0;
    webFeedbackLimit        = 100;
    webFeedbackTotalCount   = 0;
    webFeedbackTotalPages   = 0;

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

/****************************************************************************
 * 검색 엔터 칭찬불만접수
 ****************************************************************************/
function fn_webFeedbackEnter(e){
    if(e.which){
        // 파이어폭스
        if(13 == e.which) {
            //로그인 액션 스크립트
            fn_webFeedbackSearch();
        }
    }
    else{
        // 윈도우, 사파리, 크롬
        if(13 == Feedback.keyCode) {
            //로그인 액션 스크립트
            fn_webFeedbackSearch();
        }
    }
}

/****************************************************************************
 * 완료
 ****************************************************************************/
function fn_webFeedbackOk(){
    fn_webFeedbackReset();
}
// JavaScript
let branchOptions = [
    { value: "GN", label: "강남" }
];

let opinionOptions = [
    { value: "PR", label: "칭찬" },
    { value: "DS", label: "불만" },
    { value: "ET", label: "기타" }
];


let webFeedbackColumnDefs = [       
	{
        field: "branchOfficeCd",
        headerName: "지점",
        minWidth: 70,
        maxWidth: 80,
        sortable: false,
        cellStyle: { 		
			display: 'flex',
		    alignItems: 'center',        // 세로 가운데 정렬
		    justifyContent: 'center'     // 가로 가운데 정렬 (선택사항)
	    },
        cellRenderer: function(params) {
            let found = branchOptions.find(opt => opt.value === params.value);
            return found ? found.label : params.value;
        },
        editable: true,
        cellEditor: 'agSelectCellEditor',
        cellEditorParams: {
            values: branchOptions.map(opt => opt.label)
        },
        valueSetter: function(params) {
            let found = branchOptions.find(opt => opt.label === params.newValue);
            if (found) {
                params.data.branchOfficeCd = found.value;
                return true;
            }
            return false;
        }
	},
	{
	    field: "mbName",
	    headerName: "이름",
	    minWidth: 100, maxWidth: 150,
	    cellStyle: { 		
			display: 'flex',
			alignItems: 'center',        // 세로 가운데 정렬
			justifyContent: 'center'     // 가로 가운데 정렬 (선택사항)
		}
	},
    {
		field: "mbHp", 
		headerName:"핸드폰번호", 
		minWidth: 100,
		maxWidth: 120,
		cellStyle: { 		
					display: 'flex',
					alignItems: 'center',        // 세로 가운데 정렬
					justifyContent: 'center'     // 가로 가운데 정렬 (선택사항)
		},
		valueFormatter: (params) => {
		      if (!params.value) return '';
		      
		      const phone = params.value.toString().replace(/-/g, ''); // 기존 - 제거
		      
		      if (phone.length === 11) {
		        // 010-1234-5678 형태
		        return phone.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3');
		      } else if (phone.length === 10) {
		        // 02-1234-5678 형태 (지역번호가 2자리)
		        return phone.replace(/(\d{2})(\d{4})(\d{4})/, '$1-$2-$3');
		      }
		      
		      return params.value; // 형식에 맞지 않으면 원본 반환
		    }
	},    
	{
		field: "opinionClassificationCd",
        headerName: "구분",
        maxWidth: 80,
		cellStyle: { 		
			display: 'flex',
			alignItems: 'center',        // 세로 가운데 정렬
			justifyContent: 'center'     // 가로 가운데 정렬 (선택사항)
		},
        cellRenderer: function(params) {
            let found = opinionOptions.find(opt => opt.value === params.value);
            return found ? found.label : params.value;
        },
        editable: true,
        cellEditor: 'agSelectCellEditor',
        cellEditorParams: {
            values: opinionOptions.map(opt => opt.label)
        },
        valueSetter: function(params) {
            let found = opinionOptions.find(opt => opt.label === params.newValue);
            if (found) {
                params.data.opinionClassificationCd = found.value;
                return true;
            }
            return false;
        }
	},
	{
	    field: "content",
	    headerName: "내용",
		cellEditor: 'agLargeTextCellEditor',
		cellEditorPopup: true,
	    minWidth: 300, 
		maxWidth: 500,
	    cellStyle: { textAlign: 'left' },
		editable: false
	},
    {field: "regDate", headerName:"등록일",minWidth: 130, maxWidth: 150, editable: false,
		cellStyle: { 		
				display: 'flex',
				alignItems: 'center',        // 세로 가운데 정렬
				justifyContent: 'center'     // 가로 가운데 정렬 (선택사항)
			 },
	},
	{
		field: "replyContent", 
		headerName:"답변내용",
		cellEditor: 'agLargeTextCellEditor',
		cellEditorPopup: false,
	    cellEditorParams: {
	      maxLength: 4000,  // 최대 글자 수 제한
	      rows: 10,        // 표시할 줄 수
	      cols: 50         // 표시할 문자 열 수
	    },
		cellStyle: { 		
				display: 'flex'
		},
		editable: true},
	{field: "replyRegNm", headerName:"답변자",minWidth: 130, maxWidth: 150, editable: false,
	 cellStyle: { 		
		display: 'flex',
		alignItems: 'center',        // 세로 가운데 정렬
		justifyContent: 'center'     // 가로 가운데 정렬 (선택사항)
	 },
	},
	{field: "replyRegDate", 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 webFeedbackGridOptions = {
    suppressRowTransform: true,
    columnDefs: webFeedbackColumnDefs,
    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 : webFeedbackAgGridData,
    suppressRowClickSelection : true, // 로우 클릭시 체크박스 선택 true no, false yes
    localeText : {
        noRowsToShow : '조회 결과가 없습니다.'
    }, //데이터 없을 시 나오는 문구
    rowSelection : 'multiple', // row 다중 선택
    debug : false,
    onSelectionChanged: function(Feedback){ //체크박스 선택
        delList = Feedback.api.getSelectedRows();
    },
    onSortChanged: function(Feedback){
        //정렬
        webFeedbackSort = ''; //기존 정렬 초기화
        let columnArr = Feedback.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){
                    webFeedbackStart = 0;
                    webFeedbackSort += gridSortModel+' '+ gridSort + ',';
                }
                else{
                    nullCnt++;
                    if(nullCnt == columnArr.length){
                        webFeedbackSort = '';
                        webFeedbackDir = '';
                        webFeedbackStart = 0;
                    }
                }
            }
        }
        webFeedbackSort = webFeedbackSort.substring(0,webFeedbackSort.lastIndexOf( ",")); //맨끝 콤마 지우기

        fn_webFeedbackSearch();
    },
	onCellValueChanged: function(event) {
	    // Prepare data for update
	    let updatedData = event.data;
		updatedData.menuClass = menuClass; // Add menu class for backend
		
		//SMS
		updatedData.smsType = "S";
		updatedData.smsContent = updatedData.replyContent;
		updatedData.userArrData = createSingleUserArrData(updatedData.mbHp, updatedData.replyRegNm);
		
	    $.ajax({
	        url: '/feedbackReception/modFeedbackReception.do',
	        type: 'POST',
	        data: JSON.stringify(updatedData),
	        contentType: 'application/json',
	        success: function(res) {
				response = JSON.parse(res);

	            if (response.msgCode === '0') {
	                modalEvent.success('수정 완료', '수정이 성공적으로 반영되었습니다.');
					fn_selectListwebFeedbackJson();
	            } else {
	                modalEvent.danger('수정 오류', response.msgDesc);
	            }
	        },
	        error: function() {
	            modalEvent.danger('수정 오류', '수정 중 오류가 발생하였습니다.');
	        }
	    });
	}
};

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

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

function createSingleUserArrData(phoneNumber, userName) {
    return JSON.stringify({
        itemArr: [{
            phoneNumber: phoneNumber.replace(/-/g, ''),
            userName: userName.trim()
        }]
    });
}


/****************************************************************************
 * 페이지 init
 ****************************************************************************/
function fn_pageInit(){
    // 초기 페이징 처리
    $("#branchOfficeCd").val(branchOfficeCd);
	$("#mbName").val(mbName);
	$("#mbHp").val(mbHp);
	$("#opinionClassificationCd").val(opinionClassificationCd);

    fn_webFeedbackSearch("A");
}

/****************************************************************************
 * 페이지 Feedback
 ****************************************************************************/
function fn_pageFeedback(){
    // 검색 input
    $(document).on('keypress', '#branchOfficeCd', function(e) {
        fn_webFeedbackEnter(e);
    });
	// 검색 input
    $(document).on('keypress', '#mbName', function(e) {
        fn_webFeedbackEnter(e);
    });
	// 검색 input
    $(document).on('keypress', '#mbHp', function(e) {
        fn_webFeedbackEnter(e);
    });
	// 검색 input
    $(document).on('keypress', '#opinionClassificationCd', function(e) {
        fn_webFeedbackEnter(e);
    });

    // 검색 조회 버튼
    $("#btnSearchWebFeedback").click(function () {
        fn_webFeedbackSearch();
    });

    // 칭찬불만접수 등록 버튼
    $("#btnInsertWebFeedback").click(function () {
        fn_insertwebFeedbackIntro();
    });

}

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

    // 페이지 Feedback
    fn_pageFeedback();
});