/*
 * @Overview 공정 별 대기시간 집계
 */



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

  }

  // tableBuild 되었을때 getManList
  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 lastDay = new Date(year, month, 0);
            this.date_ed = lastDay;

            data['date_ed'] = lastDay.toISOString().split('T')[0];

            const monthdate = data['date_ed'].split('-')[0]+'-'+data['date_ed'].split('-')[1]+'-'
            data['date_st'] = monthdate + '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: `${dt}`, title: `${i}일`, 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 dt = i<10 ? `0${i}` : i;
                  this.tbList.deleteColumn(dt);
                }
              }
            }
          }

        }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;
            this.tbList.setData(originData);

          }else{
            kuls_alert(data.mesg);
          }
        },
        error: (req, status, err) => {
          kuls_alert(err.message);
        },
        complete: () => {
          window.clearTimeout(talert);
          this.tbList.clearAlert();

        },
      });
    })

    return true;
  }


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

  /*
   * @Overview 테이블 행 삭제 함수
   * @Parameter 없음
   * @function 선택된 모든 행 삭제
   */
  removeRow() {
    const selectedRows = this.tbList.getRows().filter(row=>{
      return row.getData().check ==="Y"
    });

    if(selectedRows.length > 0 ){

        // 선택된 각 행 삭제
        selectedRows.forEach((row) => {
          // STAUS D로 바꾸기
          row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D";
    
          const rowElement = row.getElement();
          rowElement.classList.add("remove-row");
    
        });
    }else{
      kuls_alert("삭제할 행을 선택해주세요.")
    }
  }

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

  }

  // 클릭 이벤트
  rowClick(e, tgt) {
    // 삭제가 가능하도록 ROW SELECT
    // staus D로 바꾸기?
  }
  cellClick(e, tgt) {
    // // 체크박스 클릭
    switch (tgt.getField()) {
      case "check":
        tgt.setValue(tgt.getValue() == "Y" ? null : "Y");
        break;
    }
  }

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

  getDate(){
    
    const datefields = [];

    // dateSt가 dateEd 이하인 동안 반복
    for (let dt = 1; dt <= 31; dt++) {
      let formattedDate = '';
      if(dt<10){
        formattedDate = `0${dt}`;
      }else{
        formattedDate = `${dt}`;
      }
      datefields.push({ field: `${formattedDate}`, title: `${dt}일`, width: 45,
        formatter:"money",
        formatterParams:{
          decimal:".",precision:0 
        },
        bottomCalc: "sum",
        bottomCalcFormatter:"money",
        bottomCalcFormatterParams:{ decimal:".", precision:0 },
        hozAlign:"right",
        dcss: "num",
      });
      

      // 데이터 형태에 따라서 field값 및 title값 변경가능
    }
    return datefields;
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      { formatter: "rownum", title: "NO", width: 50, frozen: true },
      { field: "OP_CD", title: "공정", width: 100, frozen: true },
      { field: "OP_NM", title: "공정명", width: 100, hozAlign:"left", frozen:true},
      ...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",
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>",
      selectableRows: 1,
    });
    
  }
  init2(){
    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList('getOperWtList', 'OP_CD', 'OP_NM', 'date_m');
    });
    // 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('getOperWtList', 'OP_CD', 'OP_NM', 'date_m');
      });
    });
  }
}


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