/*
 * @Overview 생산 오더 완료 승인
 */

class Tb_order_class {
  constructor(container) {
    this.ajaxUrl = "./mng_order_result.ajax.php";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table")
  }


  /*
 * @Overview 데이터 조회 함수
 * @Parameter mode : AJAX 비동깉 통신 시 사용할 STRING 값, ...test : 조회할 INPUT 태그의 ID 값
 */
  getMainList(mode, ...test) {
    const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
    let arr = test;
    // let testList  = new Array();
    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)?.value
        console.log(temp)
      } else {
        data[temp] = document.getElementById(temp)?.checked ? "Y" : "N";
      }
    }
    data.mode = mode
    // let USEFLAG = document.getElementById("USE_FLG").checked?"Y":"N"; //사용여부
    ajax_json({
      url: this.ajaxUrl,
      data: data,

      success: (data) => {
        console.log(data.code);
        if (data.code) {
          let Data = data.data
          for (let tempData in Data) {
            if (Data[tempData].ORD_STATUS === "080") {
              Data[tempData].ORD_STATUS = "Y"
            }
          }

          this.tbList.setData(Data);


        } 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 선택된 모든 행 삭제
   */
  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 선택된 모든 행 색 변경
  */
  rowClick(e, tgt) {
    let _this = this;
    let clickRow = tgt._row;
    let clickData = clickRow?.data;
    Tb_report.rowData = clickData;

    Tb_report.getMainList();

    if (tgt.isSelected()) {
      tgt.deselect();
      this.clearRemove(tgt);
    } else {
      this.tbList.deselectRow();
      tgt.select();

    }
  }

  /*
   * @Overview cell 클릭 함수
   * @Parameter 클릭한 cell
   * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
   */
  cellClick(e, tgt) {
    var editor = tgt.getColumn().getDefinition().editor;
    switch (tgt.getField()) {
      case "ORD_STATUS":
        tgt.setValue(tgt.getValue() == "Y" ? "" : "Y");
        tgt.getElement().classList.add("tabulator-editable");
        break;
      default:
        if (!editor) {
          this.rowClick && this.rowClick(e, tgt.getRow());

        }
        break;
    }
  }


  // 셀 수정
  cellEdited(cell) {
    cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
  }

  putData() {
    let _this = this;
    // 저장 시 상태 변화 없는 row 요청 X
    if (this.tbList.getData().filter(row => row._STATUS_).length == 0) {
      this.getMainList('getOrderList', 'order_pop', 'order_product_pop', 'order_bp_pop', 'date_st', 'date_ed');
      return false;
    }

    const blankObj = this.tbList.getRows().filter(row => {
      return Object.keys(row._row.data).filter(key => key !== '_STATUS_' && key !== 'USE_FLG').every(key => {
        const value = row._row.data[key];
        return (value === undefined || value === '');
      });
    });

    let postdata = {
      'mode': 'putOrder',
      'reqdata': JSON.stringify(this.tbList.getData().filter(row => row._STATUS_)),
    };

    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: function (data) {
        if (data.code) {
          kuls_success("저장되었습니다.");
          _this.getMainList('getOrderList', 'order_pop', 'order_product_pop', 'order_bp_pop', 'date_st', 'date_ed');
        } else {
          kuls_alert(data.msg);
        }
      },
      error: function (request, status, error) {
        kuls_alert(error.message);
      },
      complete: function () {
      }
    })

  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    console.log(this.container)
    // field 정의
    const fields = [
      {formatter: "rownum", title: "NO", width: 40},
      {
        field: "ORD_STATUS",
        title: "완료",
        width: 40,
        cssClass: "tabulator-editable",
        formatter: tb_common_funtions.formatterToggleboxGreenIcon,
        formatterParams: {checkval: "Y"},
      },
      {field: "WO_NO", title: "생산오더", width: 70, hozAlign: "left",},
      {
        field: "ORD_TYPE",
        title: "지시</br> 구분",
        width: 40,
        editorParams: {values: varsORD_TYPE},
        formatter: tb_common_funtions.formatterSelect,
        formatterParams: {values: varsORD_TYPE},
      },
      {field: "ITEM_CD", title: "품목", width: 70, hozAlign: "left"},
      {field: "ITEM_NM", title: "품명", width: 300, hozAlign: "left"},
      {field: "BP_CD", title: "거래처", visible : false},
      {field: "BP_NM", title: "거래처명", width: 80, hozAlign: "left"},
      {field: "ORD_QTY", title: "지시</br>수량", width: 40, hozAlign: "right",},
      {field: "WRK_QTY", title: "최종공정</br>실적수량", width: 60, hozAlign: "right",},
      {field: "ORD_DT", title: "지시일", width: 70, formatter:"datetime", formatterParams:{
          inputFormat:"yyyy-MM-dd",
          outputFormat:"yyyy.MM.dd",
        }
      },
      {field: "DLVY_REQ_DT", title: "납기일", width: 70, formatter:"datetime", formatterParams:{
          inputFormat:"yyyy-MM-dd",
          outputFormat:"yyyy.MM.dd",
        }
      },
      {field: "LASTORD_OP_SEQ", title: "지시</br>최종공순", width: 60},
      {field: "LASTORD_OP_CD", title: "지시</br>최종공정", width: 60},
      {field: "LASTWRK_OP_SEQ", title: "작업</br>최종공순", width: 60},
      {field: "LASTWRK_OP_CD", title: "작업</br>최종공정", width: 60},
      {field: "LAST_ED_TM", title: "최종</br>작업시간", width: 120, formatter:"datetime", formatterParams:{
          inputFormat:"yy-MM-dd HH:mm",
          outputFormat:"20"+"yy.MM.dd HH:mm",
        }
      },

      {field: "REMARK", title: "비고", width: 200},
    ];
    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>"
    });

    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList('getOrderList', 'order_pop', 'order_product_pop', 'order_bp_pop', 'date_st', 'date_ed');
    });
    // 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 filterBtn = document.querySelector("#filter_btn");
      filterBtn.addEventListener(evt, () => {
        // setFilter 또는 setData
        this.getMainList('getOrderList', 'order_pop', 'order_product_pop', 'order_bp_pop', 'date_st', 'date_ed');
        Tb_daily.getMainList('getOrderEndList', 'date_st');
      });
    });
    // 저장
    ["click", "keypress"].forEach((evt) => {
      const putBtn = document.querySelector("#put_btn");
      putBtn.addEventListener(evt, () => {
        this.putData();
        Tb_daily.getMainList('getOrderEndList', 'date_st');
      });
    });

  };
};

class Tb_report_class {
  constructor(container) {
    let _this = this;
    this.ajaxUrl = "./mng_order_result.ajax.php";
    this.code = ""; // 품목 코드
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table")
    _this.rowData = "";
  }

  // tableBuild 되었을때 getManList
  getMainList() {
    let _this = this;
    if (_this.rowData == undefined) {
      return false;
    }
    console.log(_this.rowData);
    // console.log(Tb_item.tbList.getSelectedData()[0]);
    let talert = window.setTimeout(() => {
      this.tbList.alert("Loading ...")
    }, 1000);
    ajax_json({
      url: this.ajaxUrl,
      data: {mode: "getOpList", WO_NO: _this.rowData?.WO_NO, ITEM_CD: _this.rowData?.ITEM_CD},
      success: (data) => {
        this.tbList.setData(data.data);

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

  setFilter() {
  }

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

  /*
   * @Overview 테이블 행 삭제 함수
   * @Parameter 없음
   * @function 선택된 모든 행 삭제
   */
  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) {
  }


  // 셀 수정
  cellEdited(cell) {
    cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      //  생산오더, 품목, 도면번호, 거래처, 납기일, 지시일, 지시구분, 지시 수량, 단위, 상태, 작업순서, 비고
      {field: "OP_SEQ", title: "공순", width: 40},
      {field: "OP_CD", title: "공정", width: 40},
      {field: "EMP_NM", title: "작업자", width: 70},
      {field: "FACLT_CD", title: "설비", width: 40, hozAlign : "left"},
      {field: "FACLT_NM", title: "설비명", width: 100, hozAlign : "left"},
      {field: "PRD_QTY", title: "실적<br>수량", width: 40, hozAlign : "right"},
      {field: "WRK_TM", title: "실적<br>등록시간", width: 100, formatter:"datetime", formatterParams:{
          inputFormat:"yy-MM-dd HH:mm",
          outputFormat:"20"+"yy.MM.dd HH:mm",
        }
      },
    ];

    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>"
    });

    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList('getOrderList', 'order_pop', 'order_product_pop', 'order_bp_pop', 'date_st', 'date_ed');
    });
    // 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);
    });


    // 위로 - 아래로 함수 추가할 것

  }
}

class Tb_daily_class {
  constructor(container) {
    this.ajaxUrl = "./mng_order_result.ajax.php";
    this.code = ""; //공정 코드

    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table")
  }

  /*
* @Overview 데이터 조회 함수
* @Parameter mode : AJAX 비동깉 통신 시 사용할 STRING 값, ...test : 조회할 INPUT 태그의 ID 값
*/
  getMainList(mode, ...test) {
    const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
    let arr = test;
    // let testList  = new Array();
    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)?.value
      } else {
        data[temp] = document.getElementById(temp)?.checked ? "Y" : "N";
      }
    }
    data.mode = mode
    ajax_json({
      url: this.ajaxUrl,
      data: data,

      success: (data) => {
        console.log(data.code);
        if (data.code) {
          let Data = data.data
          for (let tempData in Data) {
            if (Data[tempData].ORD_STATUS === "080") {
              Data[tempData].ORD_STATUS = "Y"
            }
          }

          this.tbList.setData(Data);


        } 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() {
    this.tbList.addRow({PROCESS: this.code, _STATUS_: "I"});
  }

  /*
   * @Overview 테이블 행 삭제 함수
   * @Parameter 없음
   * @function 선택된 모든 행 삭제 상태로 변경
   */
  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) {
    // 삭제가 가능하도록 ROW SELECT
    // staus D로 바꾸기?
  }


  // 셀 수정
  cellEdited(cell) {
    cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      {formatter: "rownum", title: "NO", width: 40},
      {field: "WO_NO", title: "생산오더", width: 70},
      {field: "ITEM_CD", title: "품목", width: 70},
      {field: "ITEM_NM", title: "품명", width: 300},
      // {field:"", title:"오더번호", width:200},
      {field: "BP_CD", title: "거래처코드", width: 70},
      {field: "BP_NM", title: "거래처명", width: 100},
      {field: "DLVY_REQ_DT", title: "납기일", width: 70, formatter:"datetime", formatterParams:{
          inputFormat:"yyyy-MM-dd",
          outputFormat:"20"+"yy.MM.dd",
        }
      },
      {field: "ORD_TYPE", title: "지시<br>구분", width: 40,formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsORD_TYPE,}},
      {
        field: "ORD_QTY", title: "지시<br>수량", width: 40,
      },
      {
        field: "PRD_QTY", title: "실적<br>수량", width: 40,
      },
      {field: "", title: "최종공정<br>완료시간", width: 80},
      {field: "", title: "완료처리<br>시간", width: 80},
    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

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

    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList('getOrderEndList', 'date_st');
    });
    // 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 Tb_order = new Tb_order_class("#order_table");
Tb_order.init();
const Tb_report = new Tb_report_class("#order_process_table");
Tb_report.init();
const Tb_daily = new Tb_daily_class("#order_check_table");
Tb_daily.init();
