/*
* @Overview 공정별 오더현황
*/


// 공정 리스트 테이블
class Tb_oper_class {
  constructor(container){
    this.ajaxUrl = "./sts_order_prod.ajax.php";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#main_table")
  }
  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  getMainList() {
    if(this.tbList.getSelectedData()[0]){
      return false;
    }
    const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);

    ajax_json({
      url: this.ajaxUrl,
      data: {
        mode: "getOperationList"

      },

      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();

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

  };
  putData(){
    let _this = this;
    let temArr       = this.tbList.getData();           // 테이블 전체 데이터
    for(let i = 0; i < temArr.length; i++){
      temArr[i].NO = (parseInt([i]) + 1)// 공정 순서의 숫자 채번
    }
    let postdata = {
      mode: 'updateSort',
      reqdata: JSON.stringify(temArr),
    };
    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: function (data) {
        if (data.code) {
          kuls_success("저장되었습니다.");
          _this.getMainList();
        }else{
          kuls_alert(data.msg);
        }
      },
      error: function (request, status, error) {
        kuls_alert(error.message);
      },
      complete: function () {
      }
    })
  }
  /*
   * @Overview 테이블 행 삭제 함수
   * @Parameter 없음
   * @function 선택된 모든 행 삭제
   */
  removeRow() {

  }
  
  /*
   * @Overview 테이블 행 선택 함수
   * @Parameter 없음
   * @function 선택된 모든 행 색 변경
   */
  rowClick(e, tgt) {
    if (tgt.isSelected()) {
      tgt.deselect();
      // Tb_order.getMainList(null);
    } else {
      this.tbList.deselectRow();
      tgt.select();
      // 생산오더 인풋에 포커스 하기
      document.querySelector('#P_WO_NO').focus();
    }
      Tb_order.getMainList();
      Tb_preview.getPreviewList({});

  }
  cellClick(e, tgt) {

  }
  
  /*
   * @Overview  셀 수정 이벤트
   * @Parameter 없음
   */
  cellEdited(cell) {
  }

  
  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    let _this = this;
    // field 정의
    const fields = [
      { field: "NO",formatter:"rownum", title:"NO", width:"50",},
      { field:"OP_CD", title:"공정코드", width: "70"},
      { field:"OP_NM", title:"공정명", width: "80"},
      { field:"DISPLAY_SEQ", title:"순서", width: "80",visible: false},
    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };
    
    this.tbList = new Tabulator(this.table, {
      layout: "fitColumns",
      data: [], //기본 데이터
      movableRows:true,
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>",
      rowFormatter: function(row) {
        // console.log(row.getPosition());
        row.update({ NO: row.getPosition() });
      }
    });
    
    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList();
    });
    // row 클릭 시에
    this.tbList.on("rowClick", (e, tgt) => {
      this.rowClick && this.rowClick(e, tgt);
    });
    // row 이동 후 에
    this.tbList.on("rowMoved", function(row){

    });
    // 공정순서 조정
    ["click", "keypress"].forEach((evt) => {

      const sortBtn = document.querySelector(".sort-btn");
      // const WO_NO = document.querySelector("#P_WO_NO").value;
      sortBtn.addEventListener(evt, () => {
        _this.putData();
      });
    });
  }
}

// 오더현황 테이블
class Tb_order_class {
  constructor(container){
    this.ajaxUrl = "./sts_order_prod.ajax.php";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#order_table")
  }
  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  getMainList(code) {
    // this.code = code;
    const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);

    return new Promise((resolve, reject) => {
      
      ajax_json({
        url: this.ajaxUrl,
        data: {
          mode: "getStsList",
          OP_CD : Tb_oper.tbList.getSelectedData()[0]?.OP_CD,
          P_WO_NO : document.getElementById("P_WO_NO").value
  
        },
        success: (data) => {
  
          if(data.code) {
            this.tbList.setData(data.data);
            resolve(data.data)
          }else{
            kuls_alert(data.mesg);
          }
        },
        error: (req, status, err) => {
          kuls_alert(err.message);
        },
        complete: () => {
          window.clearTimeout(talert);
          this.tbList.clearAlert();
  
        },
      });
    })
  };

  //현장 작업자 팝업화면
  openPop(data) {

    const bindingData = {
      WO_NO   : data['WO_NO'],
      WO_SEQ  : data['WO_SEQ'],
      OP_SEQ  : data['OP_SEQ'],
    }
    
    const pop = new FieldPop(bindingData);
    pop.init();
  }
  /*
   * @Overview 테이블 행 추가 함수
   * @Parameter 없음
   * @function 기본키, _STATUS_:I 값을 넣은 행 추가
   */
  addRow() {

  };

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

  }
  /*
   * @Overview 테이블 행 선택 함수
   * @Parameter 없음
   * @function 선택된 모든 행 색 변경
   */
  rowClick(e, tgt) {
    if (tgt.isSelected()) {
      tgt.select();
    } else {
      tgt.deselect();
    }
    
    Tb_preview.getPreviewList(tgt._row.data);
  }
  /*
   * @Overview 더블 클릭 시 팝업
   * @Parameter 없음
   * @function 팝업 오픈
   */
  dbClick(e, tgt) {
    let rowData = tgt._row.data
    

    this.openPop(tgt._row.data);
  }
  cellClick(e, tgt) {

  }
  
  /*
   * @Overview  셀 수정 이벤트
   * @Parameter 없음
   */
  cellEdited(cell) {
  }
  
  /*
   * @Overview 추가, 수정 및 삭제 데이터 저장
   * @Parameter 없음
   * @Function _STATUS_ : U, I, D Row 인 것 php 처리.
   */
  putData() {


  };

  
  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      { formatter:"rownum", title:"NO", width:40},
      { field:"WO_NO", title:"생산오더", width: 70}, //P_WO
      { field:"OP_SEQ", title:"공순", width: 40,}, 
      { field:"ITEM_GRP", title:"품목그룹", width: 60},
      { field:"ITEM_NM", title:"품명", width: 300, hozAlign:"left" }, //B_ITEM
      { field:"DLVY_REQ_DT", title:"납기일", width: 70}, //P_WO
      { field:"ITEM_CD", title:"품목코드", width: 70}, //P_WO - //B_ITEM_ROUTING
      { field:"PROC_SEQ", title:"작업<br>순서", width: 40}, //B_ITEM_ROUTING
      // { field:"DRAW_NO", title:"도면번호", width: 100}, //B_ITEM
      { field:"ORD_DT", title:"등록일", width: 70}, //P_WO
      { field:"OP_STATUS", title:"상태", width: 40,editorParams: {values: varsOP_STATUS,}, formatter: tb_custom_formatter.stopStatus, formatterParams: {values: varsOP_STATUS,}}, //P_WO
      { field:"STD_SETUP_TM", title:"준비시간<br>(분)", width: 60, formatter:"money", formatterParams:{ precision:0 }}, //B_ITEM_ROUTING
      { field:"CYCLE_TM", title:"가공시간<br>(분)", width: 60, formatter:"money", formatterParams:{ precision:0 }}, //계산값
      { field:"FACLT_CD", title:"설비", width: 50, formatter:"money", formatterParams:{ precision:0 }}, //계산값
      { field:"CUR_EMP_NO", title:"작업자", width: 70}, //계산값
      { field:"ORD_QTY",     title:"지시수량", width: 70, hozAlign:"right"}, //P_WO
      { field:"ST_TM",       title:"시작시간", width: 70}, //P_WO
      { field:"GL_TM",       title:"예상종료시간", width: 80}, //P_WO
      { field:"PRV_ED_TM",   title:"이전공정<br>종료시간", width: 70}, //P_WO
    ];

    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,
      dbClickable: true,
    });
    
    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      // this.getMainList();
    });
    // // row 클릭 시에
    this.tbList.on("rowClick", (e, tgt) => {
      this.rowClick && this.rowClick(e, tgt);
    });

    this.tbList.on("rowDblClick", (e, tgt) => {
       this.dbClick(e, tgt);

    });

    // 조회
    ["click", "keypress"].forEach((evt) => {
      const filterBtn = document.querySelector("#filter_btn");
      // const WO_NO = document.querySelector("#P_WO_NO").value;
      filterBtn.addEventListener(evt, () => {
        this.getMainList().then(data=>{
          if(data.length === 1){
            this.openPop(data[0]);
          }
        })
      });
    });
  }
}

// 오더별 공정 순서 테이블
class Tb_preview_class {
  constructor(container){
    this.ajaxUrl = "./sts_order_prod.ajax.php";
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#preview_table")
  }
  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  getPreviewList(code) {
    this.code = code;
    const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);


    ajax_json({
      url: this.ajaxUrl,
      data: {
        mode: "getPreviewList",
        OP_CD:code?.OP_CD,
        WO_NO:code?.WO_NO,
      },
      success: (data) => {
        if(data.code) {
          //DB에서 받아온 데이터 중 NULL 값이 아닌 생산 오더의 경우에만 Preview 테이블에서 확인 가능함
          const sqlData = data.data;
          let tempData = sqlData.filter((element, index, arr) => {
            return element.WO_NO !== null;
          });
          this.tbList.setData(tempData);

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

      },
    });
  };

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

  };

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

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

  cellClick(e, tgt) {

  }
  
  /*
   * @Overview  셀 수정 이벤트
   * @Parameter 없음
   */
  cellEdited(cell) {

  }
  
  
  /*
   * @Overview 추가, 수정 및 삭제 데이터 저장
   * @Parameter 없음
   * @Function _STATUS_ : U, I, D Row 인 것 php 처리.
   */
  putData() {

  };

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      { formatter:"rownum", title:"NO", width:50},
      { field:"WO_NO", title:"생산오더", width: 100}, //P_WO
      { field:"ORD_STATUS", title:"상태", width: 100, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsWO_STATUS,}},
    ];

    for(let i = 1; i<11; i++){
      if(i === 10){
        fields.push({field: `G${i}`, title: `공정 ${i}`, width: 80,
        formatter: tb_custom_formatter.status})
      }else{
        fields.push({field: `G0${i}`, title: `공정 ${i}`, width: 80,
        formatter: tb_custom_formatter.status})
      }
    };
    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,
    });

  }
}



const Tb_oper = new Tb_oper_class('#oper_section');
Tb_oper.init();
const Tb_order = new Tb_order_class('#order_section');
Tb_order.init();
const Tb_preview = new Tb_preview_class('#preview_section');
Tb_preview.init();

// 인풋에서 엔터하면 조회버튼 CLICK효과 (모든 테이블 init 이후에 위치시킬것)
document.querySelectorAll('.search-container input').forEach((input)=>{
  input.addEventListener("keyup",function(e){
    if(e.key === 'Enter'){
      e.preventDefault();
      document.querySelector('#filter_btn').click();
    }
  })
})
