/*
 * @Overview 검사 실적 관리
 */

/*
 * @Overview 검사 실적 조회
 */
class Tb_insp_detail_class {
  constructor(container) {
    this.ajaxUrl = "./mng_insp_oper.ajax.php";

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

  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  getMainList() {

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

    ajax_json({
      url: this.ajaxUrl,
      data: {
        mode   : "getInsp",
        WO_NO  : document.getElementById('WO_NO').value,
        date_st: document.getElementById('date_st').value ,
        date_ed: document.getElementById('date_ed').value,
        ITEM_CD: document.getElementById('ITEM_CD').value,
        INSP_FLG: document.getElementById('INSP_FLG').value
      },
      success: (data) => {
        if(data.code) {
          
          this.tbList.setData(data.data);
          // this.inspSeq = data.data.INSP_SEQ;
        }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, D, U ROW만 php에서 처리.
  */
  putData (){
    let pdata = this.tbList.getData();
    if(pdata.filter(row=> row._STATUS_).length == 0){
      this.getMainList(this.code);
      return false;
    }

    let dupdata = pdata.map( data => data.WC_CD ).filter( data => data );;
    if( dupdata.filter( (data,idx) => dupdata.indexOf(data) !== idx ).length > 0 ){
      kuls_alert("작업장 코드가 중복됩니다.");
      return false;
    }

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

    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: (data)=>{
        if (data.code) {
          kuls_success("저장되었습니다.");
          this.getMainList(this.pc);
          Tb_order.getMainList();
        }else{
          this.tbList.getRows().forEach( row => { //일부 적용된 열 update 처리
            if( data.data.includes(row.getData()['WO_NO']) ){
              row.update({_STATUS_:'U'});
            }
          } );
          kuls_alert(data.mesg);
        }
      },
      error: (request, status, error)=>{
        kuls_alert(error.message);
      },
      complete: function () {
      }
    });
    return true;
  };
  /*
   * @Overview 데이터 필터 함수
   * @Parameter 없음
   * @function 필터링 없음.
   */
  setFilter() {
    
  }

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

  

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

  /*
   * @Overview cell 클릭 함수
   * @Parameter 클릭한 cell
   * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
   */
  cellClick(e, tgt) {
    var editor = tgt.getColumn().getDefinition().editor;


    switch (tgt.getField()) {
      case "INSP_ITEM":
        popInsp({
          INSP_ITEM: "INSP_ITEM"
        },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;
    }
  }

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

  /*
   * @Overview 추가, 수정 및 삭제 데이터 저장
   * @Parameter 없음
   * @Function 기본키 중복 확인
   * @Function _STATUS_ U, I, D인 데이터베이스 가져와서 처리.
   */
  putData() {
    // 기본키 중복 확인 및 방지
    // _STATUS_ 있는 데이터만 들고와서 PUT하기
  }
  //팝업 아이콘
  popIcon = function(cell, formatterParams, onRendered) { //plain text value
    // if(!cell.getRow().getData().FILE_NM){
    //   // kuls_alert("");
    //   return "<button class='reverse-btn disabled-btn' diabled>미리보기</button>";
    // }
    // <i className='fa-solid fa-paperclip'></i>
    return "<button class='reverse-btn fa-solid fa-paperclip padding-1-12'></button>";
    // <i className="fa-solid fa-paperclip"></i>
  };
  openModal(cell) {

    let clickData = cell.getData();

    vnLoad("", "../reg_insp_qc/reg_insp_qc_pop.inc.php", "", (loadHtml) => {
      this.putPartnerModal = kuls_modal(loadHtml);


      const popFileUpload = new Tb_file_upload_class("#popup_file_upload",clickData);
      popFileUpload.init_insp();

    });
  }
  getInspValue() {
    const datefields = [];
    // const sample =  parseInt(Tb_insp_list.tbList.getSelectedData()[0].INSP_SAMPL_QTY);
    for (let i = 1; i <= 20; i++) {
      // 데이터 형태에 따라서 field값 및 title값 변경가능
      datefields.push({
        field: `T${i}`,
        title: i,
        width: 50,
        editor:"input",
        editable: (cell)=>{
          return i<=this.qty
        },
        formatter:tb_custom_formatter.checkInspValue,
        formatterParams:{ checkPoint : 'OKNG_FLG' },
        hozAlign:"right"
        // validator: "numeric",
      });
    }
    return datefields;
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    let _this = this;
    // field 정의
    const fields = [
      { field:"OKNG_FLG", formatter: "rownum", title: "NO", width: 40 },
      // { field: "PLN_STATUS", title: "오더 상태", width: 150 },
      { field: "WO_NO",       title: "생산오더", width: 70 },
      { field: "ITEM_CD",     title: "품목", width: 70 },
      { field: "ITEM_NM",     title: "품명", width: 100, minWidth: 40 },
      { field: "OP_SEQ",      title: "공순", width: 40 },
      { field: "OP_CD",       title: "공정", width: 40 },
      { field: "INSP_EMP_NO", title: "검사자", width: 70 },
      { field: "ORD_DT",      title: "지시 일자", width: 70,  formatter:"datetime", formatterParams:{
          inputFormat:"yy-MM-dd",
          outputFormat:"yy.MM.dd",
        }
      },
      { field: "INSP_DT",   title: "검사일자", width: 100 },
      { field: "INSP_ITEM",   title: "검사항목", width: 100, visible:false },
      { field: "INSP_NAME",   title: "검사항목명", width: 70 },
      { field: "INSP_METH",   title: "검사방법", width: 80 ,formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_METH,}},
      { field: "INSP_SEQ",    title: "검사회차", width: 70, visible: false },
      { field: "SPEC_VAL",    title: "기준값<br>(mm)", width: 70, hozAlign:"right",
        formatter: "money",
        formatterParams: {
          decimal: ".",
          precision: "2",
        },
      },
      { field: "TOL_UPPER", title: "상한치<br>(㎛)", width: 80, hozAlign:"right",
        formatter: "money",
        formatterParams: {
          decimal: ".",
          precision: "0",
        },
      },
      { field: "TOL_LOWER", title: "하한치<br>(㎛)", width: 80, hozAlign:"right",
        formatter: "money",
        formatterParams: {
          decimal: ".",
          precision: "0",
        },
      },
      { field: "INSP_TOOL", title: "측정기", width: 80,
        formatter: tb_common_funtions.formatterSelect, 
        formatterParams: {values: varsINSP_TOOL,},
      },
      {
        field: "FILE_MANAGE",
        title: "파일관리",
        width: 70,
        formatter: this.popIcon,
        cellClick:function(e,cell){
          _this.openModal(cell);
        }
      },
      {
        field: "INSP_TOOL",
        title: "측정치(㎛)",
        cssClass: "width-800",
        columns: this.getInspValue(),
      },
    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

    /*
     * @Overview tabulator 객체 생성
     * @Parameter 생성 위치(html class값)
     */
    this.tbList = new Tabulator(this.table, {
      layout: "fitColumns",
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>", //정렬 아이콘
      validationMode: "highlight"
    });


    /*
     * @Overview 테이블 만들어지면 데이터 불러오기
     * @Parameter 없음
     */
    this.tbList.on("tableBuilt", () => {
      _this.getMainList();
    });

    /*
     * @Overview 유효성 검사메세지 띄우기
     * @Parameter cell, 입력값, validators
     */
    this.tbList.on("validationFailed", (cell, value, validators)=>{
      cell.setValue("");
      let errMsg = "";
      switch(validators[0].type){
        case "alphanumeric":
          errMsg = " 필드는 특수문자를 입력할 수 없습니다.";
          break;
        case "numeric":
          errMsg = " 필드는 숫자만 입력할 수 있습니다.";
          break;
        default:
          errMsg = " 필드는 "+ validators[0].parameters;
          break;
          
      };
      
      kuls_warning(cell.getColumn().getDefinition().title + errMsg );
    });

    /*
     * @Overview cell 클릭시 체크 또는 팝업
     * @Parameter 이벤트, 셀
     */
    this.tbList.on("cellClick", (e,tgt) => {
      this.cellClick && this.cellClick(e,tgt);
    });
    
    /*
     * @Overview cell 수정 함수
     * @Parameter cell
     * @Function status u로 바꿀것
     */
    this.tbList.on("cellEdited", (cell) => {
      this.cellEdited && this.cellEdited(cell);
    });
    /*
         * @Overview 데이터 조회 함수
         * @Parameter 없음
         * @Function
    */
    document.getElementById('filter_btn').addEventListener('click',function(e){
      _this.getMainList();
    })
    /*
     * @Overview 엑셀 조회 함수
     * @Parameter 엑셀 타이틀 및 파일 제목, 엑셀에 넣을 데이터
     * @Function status u로 바꿀것
     */
    document.getElementById('excel_data').addEventListener('click', (e) => {
      const selectedRows = this.tbList.getRows().filter(row => row.isSelected()).length === 0 ? this.tbList.getRows() :this.tbList.getRows().filter(row => row.isSelected()) ;
      let data = selectedRows.map(row => row.getData());

      getExcel('검사실적조회', "검사실적조회", data);
    });
  }
}

const Tb_insp_detail = new Tb_insp_detail_class("#sub_tab_2");
Tb_insp_detail.init();
