/*
 * @Overview 작업자별 불량현황
 */



class Tb_main_class {
  constructor(container) {
    this.ajaxUrl = "./cnt_defect_worker.ajax.php";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#main_table");
  }

  // tableBuild 되었을때 getManList
  /*
 * @Overview 데이터 조회 함수
 * @Parameter mode : AJAX 비동깉 통신 시 사용할 STRING 값, ...test : 조회할 INPUT 태그의 ID 값
 */
  getMainList(mode,...test) {
    const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
    const filteringData = new Promise((resolve,resect) =>{ 
      let arr = test;

      let data = new Object();
      for(let i=0; i < arr.length; i++){
        let temp = [arr[i]]
        if(document.getElementById(arr[i]).type == "checkbox"){
            data[temp] = document.getElementById(temp).checked?"Y":"N";
        }else if(document.getElementById(arr[i]).type == "month"){

          const selectedMonth = document.getElementById(temp).value;

          if (selectedMonth) {
            const [year, month] = selectedMonth.split('-').map(Number);
            this.month = month;
            const formatMonth = month<10?`0${month}`:month;

            // 월의 마지막 날 계산
            const lastDay = new Date(year, month, 0);
            this.date_ed = lastDay;
            data['date_ed'] = lastDay.toISOString().split('T')[0];

            data['date_st'] = year + '-' + formatMonth + '-' + '01';

            const date_ed = this.date_ed;
            const lastDate = date_ed.getDate();
            const len = this.tbList.getColumns().length - 3

            if(lastDate!==1){
              if(lastDate>len){
                for(let i = len+1; i < lastDate+1; i++){
                  const dt = i<10 ? `0${i}` : i;
                  const addField = {field: `DEF_${i}`, title: `${dt}일`, width:50, formatter:"money",
                    formatterParams:{
                      decimal:".",
                      precision:"0"
                    },
                    bottomCalc: "sum",
                    bottomCalcFormatter:"money",
                    bottomCalcFormatterParams:{ decimal:".", precision:0 },
                    hozAlign:"right",
                    dcss: "num",
                  }
                  this.tbList.addColumn(addField, false);
                }
              }else{
                for(let i=lastDate+1; i<len+1; i++){

                  const deleteField = `DEF_${i}`
                  this.tbList.deleteColumn(deleteField);
                }
              }
            }
          }

        }else{
            data[temp] = document.getElementById(temp).value
        }
      }
      data.mode = mode;
      resolve(data);
    });

    filteringData.then((data)=>{
      ajax_json({
        url: this.ajaxUrl,
        data: data,

        success: (data) => {
          if(data.code) {
            let originData = data.data;
            originData = originData.map(el=>{
              el[`DEF_${el['DEF_DT']?.split('-')[1]}`] = el['DEF_QTY']
              return el;
            });

            originData = originData.reduce((acc, curr)=>{
              const key = curr.WRK_TEAM + curr.EMP_NO;

              if(!acc[key]){
                acc[key] = {...curr};
              }else{
                Object.assign(acc[key], curr)
              }

              return acc;
            }, {})
            const finData = Object.values(originData)
            this.tbList.setData(finData);
          }else{
            kuls_alert(data.mesg);
          }
        },
        error: (req, status, err) => {
          kuls_alert(err.message);
        },
        complete: () => {
          window.clearTimeout(talert);
          this.tbList.clearAlert();
        },
      });
    });
    return true;
  }

  setFilter() {}

  /*
   * @Overview 테이블 행 추가 함수
   * @Parameter 없음
   * @function 기본키, _STATUS_:I 값을 넣은 행 추가
   */
  addRow() {
  }

  /*
   * @Overview 테이블 행 삭제 함수
   * @Parameter 없음
   * @function 선택된 모든 행 삭제
   */
  removeRow() {
  }

  /*
   * @Overview 테이블 행 순서 변경 함수
   * @Parameter 방향
   * @function 선택된 모든 행 순서 변경
   */
  upDownRow(dir) {

  }

  // 클릭 이벤트
  rowClick(e, tgt) {
  }
  cellClick(e, tgt) {

  }

  // 셀 수정
  cellEdited(cell) {
    cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
  }
  putData() {
    // 기본키 중복 확인 및 방지
    // _STATUS_ 있는 데이터만 들고와서 PUT하기
  }

  getDate(){
    // Date 객체 생성
    const dateSt = new Date(document.querySelector("#date_m").value);

    const datefields = [];

    // dateSt가 dateEd 이하인 동안 반복
    for (let dt = 1; dt <= 31; dt++) {

      // 데이터 형태에 따라서 field값 및 title값 변경가능
      datefields.push({ field: `DEF_${dt}`, title: `${dt}일`, width: 50,
        formatter:"money",
        formatterParams:{
          decimal:".",precision:0 
        },
        bottomCalc: "sum",
        bottomCalcFormatter:"money",
        bottomCalcFormatterParams:{ decimal:".", precision:0 },
        hozAlign:"right",
        dcss: "num",
      });
    }
    return datefields;
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      { formatter: "rownum", title: "NO", width: 50, frozen:true },
      { field: "EMP_NM", title: "성명", width: 100, frozen:true},
      { field: "DEPT_NM", title: "부서", width: 100, visible: false },
      ...this.getDate()
    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

    this.tbList = new Tabulator(this.table, {
      layout: "fitcolumns",
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>",
      selectableRows: 1,
      groupBy:["DEPT_NM"],
      columnCalcs: "both",
      groupStartOpen: true,
      groupHeader: function(value, count, data, group){
        return `부서: ${value || '미정'}`
      }
    });
    
  }
  init2(){
    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList('getDefectWorker','worker_pop','sub_worker_pop','date_m','DEPT_CD','DEPT_NM');
    });
    // cell 클릭 시에
    this.tbList.on("cellClick", (e, tgt) => {
      this.cellClick && this.cellClick(e, tgt);
    });
    // cell 수정 시에
    this.tbList.on("cellEdited", (cell) => {
      this.cellEdited && this.cellEdited(cell);
    });
    // 엑셀
    ["click", "keypress"].forEach((evt) => {
      const excelBtn = document.querySelector("#excel_data");
      excelBtn.addEventListener(evt, () => {
        tb_common_funtions.tabu2xls_px(this.tbList, `${this.month}월 작업자별 불량현황`, `${this.month}월 작업자별 불량현황`)
      });
    });
    // 조회
    ["click", "keypress"].forEach((evt) => {
      const filterBtn = document.querySelector("#filter_btn");
      filterBtn.addEventListener(evt, () => {
        this.getMainList('getDefectWorker','worker_pop','sub_worker_pop','date_m','DEPT_CD','DEPT_NM');
      });
    });
  }
}


const Tb_main = new Tb_main_class("#main_container");
Tb_main.init();
Tb_main.init2();
