/*
 * @Overview 공정 등록
 */

class Tb_process_class {
  constructor(container) {
    let _this = this;
    _this.ajaxUrl = "./process.ajax.php";
    this.tbList = "";
    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")
  }

  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  getMainList() {
    // let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
    // ajax_json({
    //   url: this.ajaxUrl,
    //   data: { mode: "" },
    //   success: (data) => {},
    //   error: (req, status, err) => {
    //     kuls_alert(err.message);
    //   },
    //   complete: () => {
    //     // window.clearTimeout(talert);
    //     // this.tbList.clearAlert();
    //     // this.setFilter();
    //   },
    // });
  }
  /*
   * @Overview 데이터 필터 함수
   * @Parameter 없음
   */
  setFilter() {}

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

  /*
   * @Overview 테이블 행 삭제 함수
   * @Parameter 없음
   * @function 선택된 모든 행 삭제
   */
  removeRow() {
    const selectedRows = this.tbList.getRows().filter(row=>{
      return row.getData().check ==="Y"
    });
    // 선택된 각 행 삭제
    selectedRows.forEach((row) => {
      // STAUS D로 바꾸기
      row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D";

      const rowElement = row.getElement();
      rowElement.classList.add("remove-row");
    });
  }
  /*
   * @Overview 테이블 행 클릭 함수
   * @Parameter 셀
   * @function 클릭한 테이블 행 선택
   */
  rowClick(cell) {
    // 삭제가 가능하도록 ROW SELECT
    // staus D로 바꾸기?
  }

  /*
   * @Overview 테이블 셀 클릭 함수
   * @Parameter 이벤트, 타겟
   * @function 클릭한 셀에 따라 각각 다른 이벤트 설정
   * @function 팝업, 체크박스 등
   */
  cellClick(e, tgt) {
  }

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


  /*
   * @Overview 추가, 수정 및 삭제 데이터 저장
   * @Parameter 없음
   * @Function 기본키 중복 확인
   * @Function _STATUS_ U, I, D인 데이터베이스 가져와서 처리.
   */
  putData() {
    let _this = this;

    // const curdata = this.tbList.getData();
    // // BIZ_AREA_CD 사번
    // const dubbleDataCheck = curdata.map( data => data.BIZ_AREA_CD).filter(Boolean);
    // const noDubbleData = new Set(dubbleDataCheck);
    // if(noDubbleData.size !== dubbleDataCheck.length){
    //   kuls_alert("사업장 코드를 입력하지 않았거나 중복됩니다.");
    //   return false;
    // };

    // _STATUS_ D인 데이터 삭제
    // 필요하면 작성



    // _STATUS_ 있는 데이터만 들고와서 PUT하기
    const postData = {
      'mode':'putBizarea',
      'reqdata': JSON.stringify(this.tbList.getData().filter(row => row._STATUS_))
    };
    console.log(postData);
    ajax_json({
      url: _this.ajaxUrl,
      data:postData,
      success: (data)=>{
        if(data.code) {
          kuls_success("적용 되었습니다.");
          _this.getMainList();
        }else{
          // this.tbList.getRows().forEach(row =>{
          //   if(data.data.includes(row.getData()['BIZ_AREA_CD'])){
          //     row.updata({_STATUS_:"U"});
          //   }
          // });
          kuls_alert(data.mesg);
        }
      },
      error: (req, stat, err) => {
        kuls_alert(err.message);
      },
    });
    return true;
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [
      { field:"check", title: "선택", width: 50, headerSort: false,
        formatter: tb_common_funtions.formatterCheckboxIcon,
        formatterParams: { checkval: "Y" },
      },
      { formatter: "rownum", title: "NO",      minWidth: 50 ,      width: '10%' },
      { field: "OP_CD",      title: "공정 코드", minWidth: 200,     width: '15%',       editor: "input",
        editable: (cell) => {
          let val = cell.getData();
          return val._STATUS_ === "I";
        },
      },
      { field: "OP_GRP",     title: "공정 코드", minWidth: 200,     width: '15%',       editor: "input",  visible:false},
      { field: "OP_NM",      title: "공정명",    minWidth: 200,     width: '15%',       editor: "input", hozAlign:"left"},
      { field: "REMK",       title: "비고",      minWidth: 300,     width: '60%',       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",
      selectableRows: true,
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>", //정렬 아이콘
    });


    // 데이터 불러오기
    this.tbList.on("tableBuilt", () => {
      this.getMainList();
    });
    // row 클릭 시에
    this.tbList.on("rowClick", (e,tgt) => {
      this.rowClick && Tb_process.rowClick(e,tgt);
    });
    // cell 클릭 시에
    this.tbList.on("cellClick", (e,tgt) => {
      this.cellClick && Tb_process.cellClick(e,tgt);
    });
    // cell 수정 시에
    this.tbList.on("cellEdited", (e,tgt) => {
      this.cellEdited && Tb_process.cellEdited(e,tgt);
    });

    // 추가
    ["click", "keypress"].forEach((evt) => {
      this.addBtn.addEventListener(evt, () => {
        console.log("hi")
        this.addRow();
      });
    });
    // 삭제
    ["click", "keypress"].forEach((evt) => {
      this.removeBtn.addEventListener(evt, () => {
        // 삭제 함수
        this.removeRow();
      });
    });
    // 조회
    ["click", "keypress"].forEach((evt) => {
      const filterBtn = document.querySelector("#filter_worker");
      filterBtn.addEventListener(evt, () => {
        // setFilter 또는 setData
      });
    });
    // 저장
    ["click", "keypress"].forEach((evt) => {
      const putBtn = document.querySelector("#put_worker");
      putBtn.addEventListener(evt, () => {
        this.putData();
      });
    });
  }
}
const Tb_process = new Tb_process_class("#process_table");
Tb_process.init();
