/*
 * @Overview 설비 별 가동 이력 관리
 */

class Tb_total_class {
  constructor(container) {
    this.ajaxUrl = "./cnt_faclt_ct.ajax.php";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#total_table")
  }

  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  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 - 4
            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;
                  const deleteField = `${dt}`
                  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['01']? console.log(originData['01']): false;
            this.tbList.setData(data.data);
          }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 선택된 모든 행 STATUS D
   */
  removeRow() {
    const selectedRows = this.tbList.getRows().filter(row=>{
      return row.getData().check ==="Y"
    });

    if(selectedRows.length > 0 ){

      kuls_confirm("삭제","하시겠습니까?", ()=>{
        // 선택된 각 행 삭제
        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("삭제할 행을 선택해주세요.")
    }
  }

  // 클릭 이벤트
  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 month = dateSt.getMonth()+1;

    const datefields = [];

    // dateSt가 dateEd 이하인 동안 반복
    for (let dt = 1; dt <= 31; dt++) {
      let formattedDate = '';
      if(dt<10){
        formattedDate = `0${dt}`;
      }else{
        formattedDate = `${dt}`;
      }

      // 데이터 형태에 따라서 field값 및 title값 변경가능
      datefields.push({ field: formattedDate, 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:"FACLT_GRP", title:"설비그룹", width:100, frozen:true, visible: false},
      { field:"FACLT_CD", title:"설비코드", width:100, frozen:true},
      { field:"FACLT_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",
      selectableRows: 1,
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>",
      groupBy: "FACLT_GRP",
      groupHeader: function(value, count, data, group){
        return `설비그룹: ${value || '미정'}`
      },
      columnCalcs:"both",
      groupStartOpen: true,
    });

  };
  init2(){
    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList('getFacltCtList', 'date_m','FACLT_GRP_P', 'FACLT_CD', 'FACLT_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('getFacltCtList', 'date_m','FACLT_GRP_P', 'FACLT_CD', 'FACLT_NM');
      });
    });
  }
};

const Tb_total = new Tb_total_class("#main_table");
Tb_total.init();
Tb_total.init2();