/*
 * @Overview 생산 실적 등록
 * @History 2024-04-17 / 박민희
 */

class Tb_order_class {
  constructor(container) {
    this.ajaxUrl = "./reg_order_result.ajax.php";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#main_table");
    this.updateBtn = this.container.querySelector(".update-btn");
    this.addBtn = this.container.querySelector(".add-btn");
    this.removeBtn = this.container.querySelector(".remove-btn");
  }

  // tableBuild 되었을때 getManList
  getMainList(mode, ...test) {
    let _this = this;
    let data = new Object();

    let arr = test;
    let talert = window.setTimeout(() => {
      this.tbList.alert("Loading ...");
    }, 1000);
    for (let i = 0; i < arr.length; i++) {
      let temp = [arr[i]];
      console.log();
      if (document.getElementById(arr[i])?.type !== "checkbox") {
        data[temp] = document.getElementById(temp)?.value;
      } else {
        data[temp] = document.getElementById(temp)?.checked ? "Y" : "N";
      }
    }
    data.mode = mode;
    ajax_json({
      url: this.ajaxUrl,
      data: data,
      success: (data) => {
        if (data.code) {
          this.tbList.setData(data.data);
        } else {
          kuls_alert(data.mesg);
        }
      },
      error: (req, status, err) => {
        kuls_alert(err.message);
      },
      complete: () => {
        window.clearTimeout(talert);

      },
    });
  }

  setFilter() {
  }

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

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


  submitDateTime() {
    let dateTimeValue = document.getElementById("MAKE_TM").value;
    let formattedDateTime = dateTimeValue.replace("T", " ");
    console.log("서버로 보낼 날짜 및 시간: " + formattedDateTime);
  }


  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("삭제할 행을 선택해주세요.")
    }
  }

  /*
   * @Overview 삭제 취소 함수
   * @Parameter 삭제 행
   * @function  클릭시 삭제 취소 & STATUS를 공란으로 변경
   */
  clearRemove(tgt) {
    if (tgt._row.data._STATUS_ == "D") {
      tgt._row.data._STATUS_ = "";
      tgt._row.getElement().classList.remove("remove-row")
    }
  }


  /*
   * @Overview 테이블 셀 수정 함수
   * @Parameter 셀
   * @function 셀 편집이 이후 저장될수 있도록 _STATUS_:U로 데이터 업데이트
   */
  cellEdited(cell) {
    cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";

  }

  /*
   * @Overview 테이블 행 선택 함수
   * @Parameter 없음
   * @function 선택된 모든 행 색 변경
   */
  rowClick(e, tgt) {
    if (tgt.isSelected()) {
      tgt.deselect();
      this.clearRemove(tgt)
    } else {
      this.tbList.deselectRow();
      tgt.select();
    }
  }


  /*
   * @Overview cell 클릭 함수
   * @Parameter 클릭한 cell
   * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
   */
  cellClick(e, tgt) {
    switch (tgt.getField()) {
      case "WO_NO":
        popRegOrder({
          WO_NO: 'WO_NO',
          WO_SEQ: 'WO_SEQ',
          OP_SEQ: 'OP_SEQ',
          OP_CD: 'OP_CD',
          ITEM_CD: 'ITEM_CD',
          ITEM_NM: 'ITEM_NM',
          DRAW_NO: 'DRAW_NO',
          PRV_OP_CD: 'PRV_OP_CD',
          ORD_QTY: 'ORD_QTY',
          OP_WRK_QTY: 'OP_WRK_QTY',
          MAKE_TM: 'MAKE_TM',
        }, tgt.getRow())
        break;
      case "FACLT_CD":
        popFacility({
          FACLT_CD: 'FACLT_CD',
          FACLT_NM:'FACLT_NM'
        },tgt.getRow())
        break;
      case "EMP_NM":
        popWorker({
          EMP_NO: 'EMP_NO',
          EMP_NM: 'EMP_NM'
        }, tgt.getRow())
        break;

      case "check":
        tgt.setValue(tgt.getValue() == "Y" ? "" : "Y");
        this.clearRemove(tgt.getRow())
        break;
    }
  }

  putData() {
    const _this = this;

    // 빈열제거
    const blankObj = []; // 빈 행
    const reqData = []; // 저장할 행
  
    this.tbList.getRows().forEach(row => {
      if(row.getData()['_STATUS_']){
        if(Object.keys(row._row.data).filter(key => key !== '_STATUS_').every(key => {
  
          const value = row._row.data[key];
          return (value === undefined || value === '');
        })){
          blankObj.push(row);
        }else{
          reqData.push(row.getData());
        }
      }
    })
  
    // 저장할 데이터가 없으면 false 반환
    const postdata = reqData.length == 0 ? false : {
      'mode': 'putOrder',
      'reqdata': JSON.stringify(reqData),
    };
  
    // 저장할 데이터 없으면 기존 데이터 가져오기
    if(!postdata){
      _this.getMainList(
        "getRegOrder",
        "date_st",
        "date_ed",
        "WO_NO_P",
        "ITEM_CD_P",
        "OP_CD_P",
        "FACLT_CD_P"
      );
      return false;
    };

    // 빈 행 처리
    if(blankObj.length !== 0){
      kuls_confirm("비어있는 행을 무시하고 진행하시겠습니까?","",()=>{
        ajax_json({
          // 빈행 제외하고 데이터 저장
          url: this.ajaxUrl,
          data: postdata,
          success: (data)=>{
            if (data.code) {
              kuls_success("저장되었습니다.");
              _this.getMainList(
                "getRegOrder",
                "date_st",
                "date_ed",
                "WO_NO_P",
                "ITEM_CD_P",
                "OP_CD_P",
                "FACLT_CD_P"
              );
            }else{
              kuls_alert(data.mesg);
            }
          },
          error: function (request, status, error) {
            kuls_alert(error.message);
          },
          complete: function () {
          }
        });
  
      },()=>{
        // 빈행 border 붉은색으로 변경
        blankObj.forEach(row=>{
          row.getElement().classList.add("blank-row")
        })
      })
    }else{
      // 빈행 없을때 데이터 저장만
      ajax_json({
        url: this.ajaxUrl,
        data: postdata,
        success: (data)=>{
          if (data.code) {
            kuls_success("저장되었습니다.");
            _this.getMainList(
              "getRegOrder",
              "date_st",
              "date_ed",
              "WO_NO_P",
              "ITEM_CD_P",
              "OP_CD_P",
              "FACLT_CD_P"
            );
          }else{
            kuls_alert(data.mesg);
          }
        },
        error: function (request, status, error) {
          kuls_alert(error.message);
        },
        complete: function () {
        }
      });
  
    
    }

  }

  /*
   * @Overview 가동시간 formatter
   * @Parameter 없음
   * @function 가동시간 정의<데이터 형태에 따라 수정할 것>
   */
  runningTime(tgt, params) {
    const rowData = tgt.getRow().getData();
    return rowData["시작시간"] - rowData["종료시간"];
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {


    // field 정의
    const fields = [
      //  생산오더, 품목, 도면번호, 거래처, 납기일, 지시일, 지시구분, 지시 수량, 단위, 상태, 작업순서, 비고
      {
        field: "check",
        title: "선택",
        width: 40,
        headerSort: false,
        formatter: tb_common_funtions.formatterCheckboxIcon,
        formatterParams: {checkval: "Y"},
      },
      {formatter: "rownum", title: "NO", width: 40},
      {
        field: "WO_NO", title: "생산오더", width: 70,
        editor: tb_custom_editor.pkCode,
        editorParams: {type: 'upper'}, 
        formatter: tb_custom_formatter.pkCode,
        formatterParams : {tableClass: this},
        editable: (cell) => {
          const val = cell.getData();
          return val._STATUS_ === "I";
        },
      },
      {field: "WO_SEQ", width: 50, visible: false},
      {field: "RSLT_NO", width: 50, visible: false},
      {field: "ITEM_CD", width: 60, title: "품목"},
      {field: "EMP_NO", width: 50, visible: false},
      {field: "ITEM_NM", title: "품목명", width: 300, hozAlign: "start"},
      {field: "OP_CD", title: "공정", width: 40},
      {field: "OP_NM", title: "공정", width: 40, visible: false},
      {
        field: "",
        title: "설비",
        columns: [
          {title:'설비코드', field: "FACLT_CD", minWidth: 60, editor: tb_custom_editor.pop,},
          {title:'설비명', field: "FACLT_NM", minWidth: 60, },
        ]
      },
      {
        field: "ORD_QTY",
        title: "지시<br>수량",
        width: 40,
        formatter: "money",
        hozAlign: "right",
        formatterParams: {decimal: ",", precision: 0},
        dcss:'num',
      },
      {field: "PRV_OP_CD", title: "이전<br>공정", width: 80},
      {
        field: "OP_WRK_QTY", title: "이전<br>양품수량",
        width: 70,
        formatter: "money",
        hozAlign: "right",
        formatterParams: {decimal: ",", precision: 0},
        dcss:'num',
      },
      {
        field: "WRK_QTY",
        title: "작업<br>수량",
        width: 40,
        formatter: "money",
        hozAlign: "right",
        formatterParams: {decimal: ",", precision: 0},
        dcss:'num',
      },
      {
        field: "PRD_QTY",
        title: "양품<br>수량",
        width: 40,
        formatter: "money",
        hozAlign: "right",
        formatterParams: {decimal: ",", precision: 0},
        editor: "input",
        dcss:'num',
      },
      {field: "EMP_NM", title: "작업자", width: 100, cssClass:"tabulator-editable"},
      {
        field: "RSLT_GRP",
        title: "실적 그룹",
        width: 70,
        cssClass: "user-list",
        editor: "list",
        editorParams: {values: varsRSLT_GRP},
        formatter: tb_common_funtions.formatterSelect,
        formatterParams: {values: varsRSLT_GRP},
      },
      {field: "WRK_DT", title: "실적일자", width: 60,formatter:"datetime", formatterParams:{
          inputFormat:"yyyy-MM-dd",
          outputFormat:"yyyy.MM.dd",
        }
      },
      {field: "MAKE_TM", title: "실적<br>등록시간", width: 60},
      {field: "REMARK", title: "비고", width: 200, editor: "input"},
    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

    this.tbList = new Tabulator(this.table, {
      layout: "fitData",
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>"
    });

    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList(
        "getRegOrder",
        "date_st",
        "date_ed",
        "WO_NO_P",
        "ITEM_CD_P",
        "OP_CD_P",
        "FACLT_CD_P"
      );
    });

    // row 클릭 시에
    this.tbList.on("rowClick", (e, tgt) => {
      // this.rowClick && this.rowClick(e, tgt);
    });
    // cell 클릭 시에
    this.tbList.on("cellClick", (e, tgt) => {
      this.cellClick && this.cellClick(e, tgt);
    });
    // cell 수정 시에
    this.tbList.on("cellEdited", (cell) => {
      this.cellEdited && this.cellEdited(cell);
    });
    const date = new Date();
    const today = `${date.getFullYear()}-${date.getMonth()<9? '0'+(date.getMonth()+1) : date.getMonth()+1 }-${date.getDate()<9? '0'+ (date.getDate()) : date.getDate()}`;
    
    // 엑셀
    ["click", "keypress"].forEach((evt) => {
      const excelBtn = document.querySelector("#excel_data");
      excelBtn.addEventListener(evt, () => {
        tb_common_funtions.tabu2xls_px(this.tbList, `생산실적등록_${today}`, `생산실적등록_${today}`)
      });
    });

    // 추가
    ["click", "keypress"].forEach((evt) => {
      this.addBtn.addEventListener(evt, () => {
        this.addRow();
      });
    });
    ["click", "keypress"].forEach((evt) => {
      this.removeBtn.addEventListener(evt, () => {
        // 삭제 함수
        this.removeRow();
      });
    });
    // 조회
    ["click", "keypress"].forEach((evt) => {
      const filterBtn = document.querySelector("#filter_btn");
      filterBtn.addEventListener(evt, () => {
        // setFilter 또는 setData
        this.getMainList &&
        this.getMainList(
          "getRegOrder",
          "date_st",
          "date_ed",
          "WO_NO_P",
          "ITEM_CD_P",
          "OP_CD_P",
          "FACLT_CD_P"
        );
      });
    });
    // 저장
    ["click", "keypress"].forEach((evt) => {
      const putBtn = document.querySelector("#put_btn");
      putBtn.addEventListener(evt, () => {
        this.putData && this.putData();
      });
    });
  }
}

const Tb_order_report = new Tb_order_class("#order_report_table");
Tb_order_report.init();