/*
 * @Overview 생산 오더 등록
 */

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

  
  /*
 * @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) => {
        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);
        this.tbList.clearAlert();
      },
    });
    return true;
  }

  // SAP 인터페이스 조회하는 함수
  getSapList() {
    const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
    ajax_json({
      url: this.ajaxUrl,
      data: {mode: "getSapList"},

      success: (data) => {
          this.getMainList("getOrderList","order_date_st", "order_date_ed","WO_NO", "ITEM_CD"," ITEM_NM", "BP_CD", "BP_NM");
      },
      error: (req, status, err) => {
        kuls_alert(err.message);
      },
      complete: () => {
        window.clearTimeout(talert);
      },
    });
    return true;
  }




//날짜 리턴하는 함수
getTimeStamp() {
    var d = new Date();
    var s =
        this.leadingZeros(d.getFullYear(), 4) + '-' +
        this.leadingZeros(d.getMonth() + 1, 2) + '-' +
        this.leadingZeros(d.getDate(), 2);

    return s;
}
// formatting 해주는 함수
leadingZeros(n, digits) {
    let zero = '';
    n = n.toString();

    if (n.length < digits) {
      for (let i = 0; i < digits - n.length; i++)
        zero += '0';
    }

    return zero + n;
}

  /*
   * @Overview 테이블 행 추가 함수
   * @Parameter 없음
   * @function 기본키, _STATUS_:I 값을 넣은 행 추가
   */
  addRow() {
    this.tbList.addRow({ _STATUS_: "I", ORD_TYPE:"M",ORD_STATUS:'010', INSP_SAMPL_QTY:"10",ORD_DT: this.getTimeStamp() , DLVY_REQ_DT: this.getTimeStamp()},true);
  }

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

        // 선택된 각 행 삭제
        selectedRows.forEach((row) => {
          console.log(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;

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

    }
   if(document.getElementById("hidden_item_cd")?.value === clickData?.ITEM_CD){
     return false;
   }
  }

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

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

  /*
   * @Overview cell 클릭 함수
   * @Parameter 클릭한 cell
   * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
   */
  cellClick(e, tgt) {
    var editor = tgt.getColumn().getDefinition().editor;
    switch (tgt.getField()) {
      case "ITEM_CD":
        popRouting({}, tgt.getValue())
        break;
      case "ITEM_NM":
        popItem({
          ITEM_CD: "ITEM_CD",
          ITEM_NM: "ITEM_NM",
        },tgt.getRow())
        break;
      case "BP_NM":
        popClient({
          BP_CD: "BP_CD",
          BP_NM: "BP_NM"
        },tgt.getRow())
      break;
      case "check":
        tgt.setValue(tgt.getValue() == "Y" ? "" : "Y");
        this.clearRemove(tgt.getRow())
        break;
      default:
        if (!editor) {
          this.rowClick && this.rowClick(e, tgt.getRow());

        }
        break;
    }
  }
  
  //편성확정
  chWoStatus(){
    let _this = this;
    const selectedRows = this.tbList.getData().filter(row=>{
      return row.check ==="Y"
    });

    if(selectedRows.length === 0){
      kuls_alert("편성확정할 오더를 선택해주세요.");
      return;
    }

    let postdata = {
      'mode': 'chWoStatus',
      'reqdata': JSON.stringify(selectedRows),
    };
      ajax_json({
        url: this.ajaxUrl,
        data: postdata,
        success: function (data) {
          if (data.code == 1) {
            _this.getMainList("getOrderList","order_date_st", "order_date_ed","WO_NO", "ITEM_CD"," ITEM_NM", "BP_CD", "BP_NM");
            kuls_success("저장되었습니다.");
            // Tb_workPlace.getMainList();
          }else{
            kuls_alert(data.msg);
          }
        },
        error: function (request, status, error) {
          kuls_alert(error.message);
        },
        complete: function () {
        }
      });
  }

  copyRow(){
    let _this = this;

    let clickData = this.tbList.getSelectedData()[0];

    const selectedRows = this.tbList.getData().filter(row=>{
      return row.check ==="Y"
    });

    if(selectedRows.length === 0){
      kuls_alert("체크박스를 선택해주세요.");
      return;
    }


    let postdata = {
      'mode': 'copyList',
      'reqdata': JSON.stringify(selectedRows),
    };
    ajax_json({

      url: "./reg_order.ajax.php",
      data: postdata,
      success:( data ) => {
        if( data.code ){
          kuls_success("재편성이 완료됐습니다");
          //공정 편성 후에는 조회 값이 모두 초기화 되어야함
          _this.getMainList("getOrderList");
          Tb_check.getMainList(clickData);
          Tb_process.getMainList(clickData);
        }else{

        }
      },
      error: (request, status, error)=>{
        kuls_alert(error.message);
      },
    });
    document.getElementById("hidden_item_cd").value = this.tbList?.getSelectedData()[0]?.ITEM_CD;
  }

  putData() {
    let _this = this;
    // 저장 시 상태 변화 없는 row 요청 X
    if(this.tbList.getData().filter(row=> row._STATUS_).length == 0){
      // this.getMainList("getOrderList","order_date_st", "order_date_ed", "ITEM_CD"," ITEM_NM", "BP_CD", "BP_NM");
      return false;
    }
    let tempData =  this.tbList.getData().filter( row=> row._STATUS_).filter( row=> row.WO_NO !== undefined)

    if(tempData.length == 0){
      this.getMainList("getOrderList","order_date_st", "order_date_ed","WO_NO", "ITEM_CD"," ITEM_NM", "BP_CD", "BP_NM");
      return false;
    }

    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) {
              _this.getMainList("getOrderList","order_date_st", "order_date_ed","WO_NO", "ITEM_CD"," ITEM_NM", "BP_CD", "BP_NM");
              kuls_success("저장되었습니다.");
              // Tb_workPlace.getMainList();
            }else{
              kuls_alert(data.msg);
            }
          },
          error: function (request, status, error) {
            kuls_alert(error.message);
          },
          complete: function () {
          }
    })

  }

  /*
   * @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:"ORD_STATUS", title:"상태", width:50, editable:false, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsWO_STATUS,}},
      {field:"WO_NO", title:"생산오더", width:70,
        editor: tb_custom_editor.pkCode,
        formatter: tb_custom_formatter.pkCode,
        formatterParams : {tableClass: this},
      },
      {field:"ORD_TYPE", title:"지시 구분", width:70,editable:false, editorParams: {values: varsORD_TYPE,}, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsORD_TYPE,}},
      {field:"PROC_SEQ", title:"작업<br>순서", width:50,hozAlign:"center",editor: "input" },
      {field:"ITEM_CD", title:"품목", width:80 ,editor:tb_custom_editor.pop},
      {field:"ITEM_NM", title:"품명", width:300,hozAlign:"left", editor:tb_custom_editor.pop },
      {field:"BP_CD", title:"거래처", visible: false,},
      {field:"BP_NM", title:"거래처", width:170 , editor:tb_custom_editor.pop , hozAlign:"left"},
      {field:"ORD_DT", title:"릴리즈일", width:80 ,
        editor:'date',
        editorParams: {max:'9999-12-31'},
        formatter:"datetime",
        formatterParams:{
          inputFormat:"yyyy-MM-dd",
          outputFormat:"yyyy.MM.dd",
        },
        cssClass:"editable-cell", },
      {field:"DLVY_REQ_DT", title:"납기일", width:80 ,
        editor:'date',
        editorParams: {max:'9999-12-31'},
        formatter:"datetime",
        formatterParams:{
          inputFormat:"yyyy-MM-dd",
          outputFormat:"yyyy.MM.dd",
        },
        cssClass:"editable-cell",},
      {field:"ORD_QTY", title:"지시수량", width:60 ,hozAlign:"right",editor: "input", cssClass:"editable-cell",},
      {field:"INSP_SAMPL_QTY", title:"검사<br>시료수", width:60 ,hozAlign:"right" ,editor: "input",},
      {field:'REMARK', title:'비고', width:300 ,editor: "input", hozAlign:"left"}
    ];
    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_date_st", "order_date_ed", "WO_NO", "ITEM_CD","ITEM_NM", "BP_CD", "BP_NM","WO_STATUS", "ITEM_GRP");
    });
    // 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) => {
      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("getOrderList","order_date_st", "order_date_ed", "WO_NO", "ITEM_CD","ITEM_NM", "BP_CD", "BP_NM","WO_STATUS", "ITEM_GRP");
        Tb_process.getMainList();
        Tb_check.getMainList();
      });
    });

    // 편성
    ["click", "keypress"].forEach((evt) => {
      const copyBtn = document.querySelector("#copy_btn");
      copyBtn.addEventListener(evt, () => {
        kuls_confirm("공정과 검사항목을 모두 재편성하시겠습니까?","",()=>{
          this.copyRow();
        })

      });
    });
    // 편성 확정
    ["click", "keypress"].forEach((evt) => {
      const copyBtn = document.querySelector("#orgna_btn");
      copyBtn.addEventListener(evt, () => {
        kuls_confirm("편성을 확정하시겠습니까?","",()=>{
          this.chWoStatus();
        })
      });
    });

    //SAP 조회
    ["click", "keypress"].forEach((evt) => {
      const sapBtn = document.querySelector("#sap_btn");
      sapBtn.addEventListener(evt, () => {
        this.getSapList();
      });
    });

    //생산오더 업로드 팝업
    ["click", "keypress"].forEach((evt) => {
      const uploadOrder = document.querySelector("#pop_upload_order_btn");
      uploadOrder.addEventListener(evt, () => {
        // 모달 열기
        vnLoad("", "./popUploadOrder.php", "", (loadHtml) => {
          const modal = kuls_modal(loadHtml);

          const Tb_pop = new Tb_pop_class('#pop_upload_order',modal);
          Tb_pop.init();
        });
      });
    });

    // 복사
    ["click", "keypress"].forEach((evt) => {
      const copyorder = document.querySelector("#copy_order_btn");
      copyorder.addEventListener(evt, () => {
        const selectedRows = this.tbList.getSelectedRows();
        if(selectedRows.length > 0 ){
          if(selectedRows.length === 1){
              vnLoad('', './popOrderCopy.php', '', (loadHtml) => {
                const modal = kuls_modal(loadHtml);
                const data = selectedRows[0].getData()
                const copyOrderVue = new CopyOrderVueClass(data, modal);
                copyOrderVue.init();
              })
            }else{
            kuls_alert("복사는 하나씩 가능합니다.")
          }
        }else{
          kuls_alert("복사할 행을 선택해주세요.")
        }
      });
    });
    // 저장
    ["click", "keypress"].forEach((evt) => {
      const putBtn = document.querySelector("#put_btn");
      putBtn.addEventListener(evt, () => {
        this.putData();
        Tb_process.putData();
        Tb_check.putData();
      });
    });
  };
};

class CopyOrderVueClass{
  constructor(data, modal){
    this.innerData = data;
    this.modal = modal;
  }
  init(){
    const WO_NO = this.innerData.WO_NO;
    const BP_NM = this.innerData.BP_NM;
    const BP_CD = this.innerData.BP_CD;
    const DLVY_REQ_DT = this.innerData.DLVY_REQ_DT;
    const PROC_SEQ = this.innerData.PROC_SEQ;

    const modal = this.modal;

    const vueForm = createApp({
      data() {
        return {
          formData : {
            WO_NO: `${WO_NO}_copy`,
            BASE_WO_NO: WO_NO, //가져오기
            ORD_QTY: "",
            ORD_DT: "", //오늘
            DLVY_REQ_DT: DLVY_REQ_DT,
            BP_NM: BP_NM,
            BP_CD: BP_CD,
            PROC_SEQ: PROC_SEQ,
            REMARK: "",
          },

          modal: modal
        }
      },
      mounted(){
        const todayDate = new Date();
        const futureDate = new Date(todayDate);
        // futureDate.setDate(todayDate.getDate() + 10);

        this.formData.ORD_DT = this.covertDateToString(todayDate);
        // this.formData.DLVY_REQ_DT = this.covertDateToString(futureDate);
      },
      watch(){
        this.formData['BP_CD'] = document.querySelector("#BP_CD_FLT").value;
      },
      methods:{
        covertDateToString(date){
          const year = date.getFullYear();
          const month = ('0' + (date.getMonth() + 1)).slice(-2);
          const day = ('0' + date.getDate()).slice(-2);

          return `${year}-${month}-${day}`;
        },
        popPartner(){
          popClient({
            BP_CD: "BP_CD_FLT",
              BP_NM: "BP_NM_FLT",
            });
          },
          submit(){
            const setData = new Promise((resolve,resect)=>{
              this.formData['BP_CD'] = document.querySelector("#BP_CD_FLT").value;
              this.formData['BP_NM'] = document.querySelector("#BP_NM_FLT").value;
              resolve(this.formData);
            });
            setData.then((data)=>{

              let postdata = {
                ...data,
                mode: 'putCopyOrder',
              };
              ajax_json({
                url: "./reg_order.ajax.php",
                data: postdata,
                success: (data)=>{
                  if (data.code) {
                    kuls_success("저장되었습니다.");
                    this.modal.delete();
                    Tb_order.getMainList("getOrderList","order_date_st", "order_date_ed","WO_NO", "ITEM_CD"," ITEM_NM", "BP_CD", "BP_NM");
                  }else{
                    kuls_alert(data.mesg);
                  }
                },
                error: function (request, status, error) {
                  kuls_alert(error.message);
                },
                complete: function () {
                }
          
              })
            })

        
        }
      }
    }).mount("#popup_order_copy");
  }
}

class Tb_process_class {
  constructor(container) {
    this.ajaxUrl = "./reg_order.ajax.php";
    this.code =""; // 품목 코드
    this.lastNum = 0;
    this.prodData = "";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table")
    this.upBtn = this.container.querySelector(".up-btn") || ""
    this.downBtn = this.container.querySelector(".down-btn") || ""
    this.addBtn = this.container.querySelector(".add-btn")
    this.removeBtn = this.container.querySelector(".remove-btn")
  }

  // tableBuild 되었을때 getManList
  getMainList(clickData,bool) {
    let _this = this;
    let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
    ajax_json({
      url: this.ajaxUrl,
      data: { mode : "getProcessList", WO_NO : clickData?.WO_NO},
      success: (data) => {

        this.tbList.setData(data.data);

        if(data.data.length == 0){
          this.lastNum = 0
          console.log(this.lastNum);
        }else{
          this.lastNum = Math.max(...data.data.map(v=>v.OP_SEQ));
        }
        if(bool){
          this.editingRout(data.data);
        }
      },
      error: (req, status, err) => {
        kuls_alert(err.message);
      },
      complete: () => {
        window.clearTimeout(talert);
        this.tbList.clearAlert();

      },
    });
  }

  getSortList(clickData) {
    let _this = this;
    let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);

    ajax_json({
      url: this.ajaxUrl,
      data: { mode : "getProcessList", WO_NO : clickData.WO_NO},
      success: (data) => {

        this.tbList.setData(data.data);

        if(data.data.length == 0){
          this.lastNum = 0
          console.log(this.lastNum);
        }else{
          this.lastNum = Math.max(...data.data.map(v=>v.OP_SEQ));

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

  /*
   * @Overview 테이블 행 추가 함수
   * @Parameter 없음
   * @function 기본키, _STATUS_:I 값을 넣은 행 추가
   */
  addRow() {
    if(Tb_order.tbList.getSelectedData()[0]?.WO_NO === undefined){
      kuls_alert("생산오더를 선택해주세요");
      return false;
    }
    this.lastNum += 10;
    this.tbList.addRow({ OP_SEQ : this.lastNum, WO_NO : Tb_order.tbList.getSelectedData()[0].WO_NO, _STATUS_: "I",ORD_QTY:Tb_order.tbList.getSelectedData()[0].ORD_QTY });
  }


  /*
   * @Overview 테이블 순서 정렬 함수
   * @Parameter 없음
   * @function
   *
   * 첫번째 공정에 대하여
   * FRIST_OP_FLG : 'Y'
   * LAST_OP_FLG  : 'N'
   * 이전 공정     :  ''
   * 다음 공정     :  다음 공정 표시
   *
   * 마지막 공정에 대하여
   * FRIST_OP_FLG : N
   * LAST_OP_FLG  : Y
   * 이전 공정     :  이전 공정 표시
   * 다음 공정     :  ''
   */
  sortingRouting(data){
    let temArr;
    if(!data){
     temArr       = this.tbList.getData();                // 테이블 전체 데이터
    }else{
      temArr       = data;                                // 파라미터 받은 데이터
    }
    if(temArr.length === 1){                              // 공정이 하나만 존재하는 경우
      temArr[0].OP_SEQ  = 10;
      temArr[0].FRST_OP_FLG = 'Y'
      temArr[0].LAST_OP_FLG = 'Y'
      temArr[0].PRV_OP_CD   = ''
      temArr[0].NXT_OP_CD   = ''
    }else{
      for(let i = 0; i < temArr.length; i++){
        temArr[i].OP_SEQ = (parseInt([i]) + 1) * 10 // 공정 순서의 숫자 채번
        if(parseInt([i]) === 0){                    // 0인 경우 => 첫번째 공정 순서의 경우
          temArr[0].FRST_OP_FLG = 'Y'                     // 첫번째 공정에 대하여 Y
          temArr[0].LAST_OP_FLG = 'N'                     // 마지막 공정에 대하여 N
          temArr[0].PRV_OP_CD   = ''                      // 이전의 공정에 대하여 빈값 부여
        }else{                                            // 0이 아닌경우 => 두번째 공정 순서부터 값 부여
          temArr[i].FRST_OP_FLG = 'N'                     //첫번째 공정이 아닌 경우
          temArr[i].LAST_OP_FLG = 'N'
          temArr[i].PRV_OP_CD = temArr[i-1].OP_CD;        //  이전의 공정에 대하여 VALUE 바인딩
          temArr[i - 1].NXT_OP_CD = temArr[i].OP_CD;      //  다음의 공정에 대하여 VALUE 바인딩
        }

        if(parseInt([i]) === temArr.length-1){      // 마지막 공정의 경우
          temArr[temArr.length-1].FRST_OP_FLG = 'N'
          temArr[temArr.length-1].LAST_OP_FLG = 'Y'
          temArr[temArr.length-1].NXT_OP_CD   = ''
        }

        // some : I나 D 상태가 하나라도 있으면 TRUE 반환
        if(temArr.some(x=>x._STATUS_ === "I" ||temArr.some(x=>x._STATUS_ === "D" ))){
        }else if(temArr.some(x=>x._STATUS_ === "U")||temArr.some(x=>x)){
          temArr[i]._STATUS_ = "U";
        }
      }
    }
    return temArr
  }
  /*
   * @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 선택된 모든 행 색 변경
  */
  rowClick(e, tgt) {
   if (tgt.isSelected()) {
     tgt.deselect();
     this.clearRemove(tgt);
    } else {
      this.tbList.deselectRow();
       tgt.select();

     }
  }
 
  /*
  * @Overview 삭제 취소 함수
  * @Parameter 삭제 행
  * @function  클릭시 삭제 취소 & STATUS를 공란으로 변경
  */
  clearRemove(tgt){
     if(tgt._row.data._STATUS_ == "D"){
       // console.log();
       tgt._row.data._STATUS_ = "";
       tgt._row.getElement().classList.remove("remove-row")
     }
   }
 
   // 셀 수정
   cellEdited(cell) {
     cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
   }
 
   /*
    * @Overview cell 클릭 함수
    * @Parameter 클릭한 cell
    * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
    */
   cellClick(e, tgt) {
     var editor = tgt.getColumn().getDefinition().editor;
     switch (tgt.getField()) {
       case "USE_FLG":
         tgt.setValue(tgt.getValue() == "Y" ? "N" : "Y");

         break;
       case "check":
         tgt.setValue(tgt.getValue() == "Y" ? "" : "Y");
         this.clearRemove(tgt.getRow())
         break;
       default:
         if (!editor) {
           this.rowClick && this.rowClick(e, tgt.getRow());
         }
         break;
     }
   }
  putData() {
    let _this = this;
    let tempData =  this.tbList.getData().filter( row=> row._STATUS_).filter( row=> row.OP_CD !== undefined)
    if(tempData.length == 0){
      // this.getMainList();
      return false;
    }
    // 저장 시 상태 변화 없는 row 요청 X
    if(this.tbList.getData().filter(row=> row._STATUS_).length == 0){

      return false;
    }

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

    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: function (data) {
        if (data.code) {
          kuls_success("저장되었습니다.");
          _this.getMainList(Tb_order.tbList.getSelectedData()[0], true);
        }else{
          kuls_alert(data.msg);
        }
      },
      error: function (request, status, error) {
        kuls_alert(error.message);
      },
      complete: function () {
      }
    })

  }

  putSortData() {
    let _this = this;

    let postdata = {
      mode: 'putOrder',
      reqdata: JSON.stringify(this.sortingRouting().filter( row=> row._STATUS_ )),
    };
    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: function (data) {
        if (data.code) {

        }else{
          kuls_alert(data.msg);
        }
      },
      error: function (request, status, error) {
        kuls_alert(error.message);
      },
      complete: function () {
      }
    })

  }



  editingRout(edit) {
    let _this = this;
    console.log(edit);
    let postdata = {
      mode: 'putProcess',
      reqdata: JSON.stringify(_this.sortingRouting(edit).filter( row=> row._STATUS_ )),
    };
    console.log(postdata);
    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: function (data) {
        if (data.code) {
          _this.getSortList(Tb_order.tbList.getSelectedData()[0]);
        }else{
        }
      },
      error: function (request, status, error) {
        kuls_alert(error.message);
      },
      complete: function () {
      }
    })

  }


  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      //  생산오더, 품목, 도면번호, 거래처, 납기일, 지시일, 지시구분, 지시 수량, 단위, 상태, 작업순서, 비고
      { field:"check", title: "삭제", width: 40, headerSort: false,
        formatter: tb_common_funtions.formatterCheckboxIcon,
        formatterParams: { checkval: "Y" },
      },
      {field:"WO_SEQ", formatter:"rownum", title:"NO", width:40},
      {field:"OP_SEQ", title:"공순", width:40},
      {field:"OP_CD", title:"공정코드", width:80,editor: "input",cellDblClick:function(e, cell){
          popOper({
            OP_CD : "OP_CD",
            OP_NM: "OP_NM",
            ITEM_CD: Tb_order.tbList.getSelectedData()[0].ITEM_CD
          },cell.getRow());
        }, cssClass: "editable-cell"
      },
      {field:"OP_NM", title:"공정명", width:100,editor: "input", cssClass: "editable-cell"},
      {field:"WO_OP_AMT", title:"공정 단가", width:80 ,editor: "input",},
      {field:"OP_STATUS", title:"공정 상태", width:70,formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsOP_STATUS,}},
      { field: "STD_SETUP_TM", title: "준비시간</br>(분)", width: 70, editor: "input",},
      { field: "CYCLE_TM", title: "공정시간</br>(분)", width: 70, editor: "input",},

    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

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

      if(!row._row.data.WO_SEQ){

      }
    });
    // row 이동 후 에
    this.tbList.on("rowMoved", function(row){
      let _this = this;
      //row - row component
      if(Tb_process.sortingRouting().some(x=>x._STATUS_ == "I")){
        kuls_alert("현재 입력 중인 라우팅을 저장 후 공정 순서를 조정해주세요")
        Tb_process.getMainList();
      }else{
        const rowElement = row.getElement();
        rowElement.classList.add("edit-row");
        row._row.getData()._STATUS_ = "U";
      }
    });
    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      // this.getMainList();
    });
    // 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) => {
      this.addBtn.addEventListener(evt, () => {
        this.addRow();
      });
    });
    // 삭제 함수
    ["click", "keypress"].forEach((evt) => {
      this.removeBtn.addEventListener(evt, () => {
        this.removeRow();
      });
    });

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

  }
}

class Tb_check_class {
  constructor(container) {
    this.ajaxUrl = "./reg_order.ajax.php";
    this.code = ""; //공정 코드
    this.prodData = "";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table")
    this.addBtn = this.container.querySelector(".add-btn")
    this.removeBtn = this.container.querySelector(".remove-btn")
  }

  // tableBuild 되었을때 getManList
  getMainList(clickData) {
    let _this = this;
    let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);

    ajax_json({
      url: this.ajaxUrl,
      data: {
        mode : "getCheckList",
        WO_NO : clickData?.WO_NO,
        // WO_SEQ : Tb_process.tbList.getSelectedData()[0]?.WO_SEQ
      },
      success: (data) => {
        this.tbList.setData(data.data);
      },
      error: (req, status, err) => {
        kuls_alert(err.message);
      },
      complete: () => {
        window.clearTimeout(talert);
        // this.getMainList();
        this.tbList.clearAlert();
        // this.setFilter();
      },
    });
  }

  setFilter() {}

  /*
   * @Overview 테이블 행 추가 함수
   * @Parameter 없음
   * @function 기본키, _STATUS_:I 값을 넣은 행 추가
   */
  addRow() {
    if(Tb_order.tbList.getSelectedData()[0]?.WO_NO == undefined){
      kuls_alert("생산오더를 선택해주세요");
      return false;
    }

    if(Tb_process.tbList.getSelectedData()[0]?.OP_CD == undefined){
      kuls_alert("공정을 선택해주세요");
      return false;
    }

    if(Tb_process.tbList.getSelectedData()[0]?.WO_SEQ == undefined){
      kuls_alert("공정을 저장해주세요");
      return false;
    }
    this.tbList.addRow(
        {WO_NO : Tb_order.tbList.getSelectedData()[0].WO_NO,
          WO_SEQ: Tb_process.tbList.getSelectedData()[0].WO_SEQ,
          OP_CD: Tb_process.tbList.getSelectedData()[0].OP_CD ,
          OP_SEQ: Tb_process.tbList.getSelectedData()[0].OP_SEQ ,
          _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 선택된 모든 행 색 변경
  */
  rowClick(e, tgt) {
    if (tgt.isSelected()) {
      tgt.deselect();
      this.clearRemove(tgt);
     } else {
       this.tbList.deselectRow();
       tgt.select();
 
     }
   }
 
   /*
    * @Overview 삭제 취소 함수
    * @Parameter 삭제 행
    * @function  클릭시 삭제 취소 & STATUS를 공란으로 변경
    */
   clearRemove(tgt){
     if(tgt._row.data._STATUS_ == "D"){
       // console.log();
       tgt._row.data._STATUS_ = "";
       tgt._row.getElement().classList.remove("remove-row")
       // const selectedRows = this.tbList.getSelectedRows(); // 선택된 모든 행 가져오기
     }
   }
 
   // 셀 수정
   cellEdited(cell) {
     cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
   }
 
   /*
    * @Overview cell 클릭 함수
    * @Parameter 클릭한 cell
    * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
    */
  cellClick(e, tgt) {
    var editor = tgt.getColumn().getDefinition().editor;
    switch (tgt.getField()) {
      case "USE_FLG":
        tgt.setValue(tgt.getValue() == "Y" ? "N" : "Y");
        break;
      case "check":
        tgt.setValue(tgt.getValue() == "Y" ? "" : "Y");
        this.clearRemove(tgt.getRow())
        break;
      case "OKNG_FLG":
        tgt.setValue(tgt.getValue() == "Y" ? "N" : "Y");

        if(tgt.getValue() === "Y"){
          tgt.getRow().update({SPEC_VAL:"",TOL_UPPER:"",TOL_LOWER:""});
        }else{
          tgt.getRow().getCell("SPEC_VAL").getElement().classList.add("tabulator-editable");
          tgt.getRow().getCell("TOL_UPPER").getElement().classList.add("tabulator-editable");
          tgt.getRow().getCell("TOL_LOWER").getElement().classList.add("tabulator-editable");
        }
        tgt.getElement().classList.add("tabulator-editable");
        break;
      default:
        if (!editor) {
          this.rowClick && this.rowClick(e, tgt.getRow());
        }
        break;
    }
  }
  putData() {
    let _this = this;
    let tempData =  this.tbList.getData().filter( row=> row._STATUS_).filter( row=> row.INSP_NAME !== undefined)
    if(tempData.length == 0){
      // this.getMainList();
      return false;
    }
    // 저장 시 상태 변화 없는 row 요청 X
    if(this.tbList.getData().filter(row=> row._STATUS_).length == 0){
      // this.getMainList();
      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': 'putCheck',
      '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(Tb_order.tbList.getSelectedData()[0]);
          // Tb_workPlace.getMainList();
        }else{
          kuls_alert(data.msg);
        }
      },
      error: function (request, status, error) {
        kuls_alert(error.message);
      },
      complete: function () {
      }
    })

  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    let copiedData = null; // 복사된 데이터 저장 변수
    // 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",visible:false},
      {field:"OP_CD",title:"공정", width:40},
      {field:"OP_SEQ",title:"공순", width:40},
      {field:"WO_SEQ", visible:false},
      {field:"INSP_ITEM", title:"검사항목",visible: false,width:20},
      {field:"INSP_SEQ", title:"검사순번",visible: false,width:20},
      {field:"INSP_NAME", title:"검사항목명", width:70,editor: "input",
        cellDblClick:function(e, tgt){
          popOperCheck({
            // WO_NO:Tb_order.tbList.getSelectedData()[0].WO_NO,
            ITEM_CD: Tb_order.tbList.getSelectedData()[0].ITEM_CD,
            INSP_NAME : "INSP_NAME",
            INSP_METH: "INSP_METH",
            INSP_ITEM : "INSP_ITEM",
          },tgt.getRow());
        },
        cssClass: "editable-cell"
      },
      {field:"INSP_METH", title:"검사방법", width:80,
        editor: "list", editorParams: {values: varsINSP_METH,}, 
        formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_METH,},
        cssClass: "user-list"
      },
      {field:"INSP_TOOL", title:"측정기", width:100,
        editor: "list", editorParams: {values: varsINSP_TOOL,},
        formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_TOOL,},
        cssClass: "user-list",
        hozAlign: "left",

      },
      { field: "OKNG_FLG", title: "OK/NG",  width: 70, cssClass: "tabulator-editable", formatter: tb_common_funtions.formatterToggleboxGreenIcon, formatterParams: { checkval: "Y" }, },
      // {field:"SPEC_UNIT", title:"단위",  width:100, editor:"list",editorParams: {values: varsUNIT,} ,formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsUNIT,}},
      {field:"SPEC_VAL",  title:"기준값</br>(㎜)", width:60,editor: "input",
        formatter: tb_custom_formatter.limitValue,
        formatterParams: {
          checkPoint : "OKNG_FLG",
          decimal: 3
        },
        editable:(cell) => {
          if(cell.getData().OKNG_FLG == 'Y'){
            // cell.setValue(0)
          }
          return cell.getData().OKNG_FLG !== 'Y';
        },
      },
      {field:"TOL_UPPER", title:"상한값</br>(㎛)", width:60,editor: "input",
        formatter: tb_custom_formatter.limitValue,
        formatterParams: {
          checkPoint : "OKNG_FLG"
        },
        editable:(cell) => {
          if(cell.getData().OKNG_FLG == 'Y'){

          }
          return cell.getData().OKNG_FLG !== 'Y';
        },
      },
      {field:"TOL_LOWER", title:"하한값</br>(㎛)", width:60,editor: "input",
        formatter: tb_custom_formatter.limitValue,
        formatterParams: {
          checkPoint : "OKNG_FLG"
        },
        editable:(cell) => {
          if(cell.getData().OKNG_FLG == 'Y'){

          }
          return cell.getData().OKNG_FLG !== 'Y';
        },
      },
      {field:"REMARK", title:"비고", editor:"input", width: 300,hozAlign:"left"},
    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화

    };

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

    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      // this.getMainList("getOrderList","order_date_st", "order_date_ed", "ITEM_CD"," ITEM_NM", "BP_CD", "BP_NM");
    });
    // 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);
    });

    // 추가
    ["click", "keypress"].forEach((evt) => {
      this.addBtn.addEventListener(evt, () => {
        this.addRow();
      });
    });
    ["click", "keypress"].forEach((evt) => {
      this.removeBtn.addEventListener(evt, () => {
        // 삭제 함수
        // this.rowDeleted();
        this.removeRow();

      });
    });

  }
}

const Tb_order = new Tb_order_class("#order_table");
Tb_order.init();
const Tb_process = new Tb_process_class("#order_process_table");
Tb_process.init();
const Tb_check = new Tb_check_class("#order_check_table");
Tb_check.init();
