import {getShipAll} from "@/api/gj/base";
import {endLoading, startLoading} from "@/utils/index";
import {upload} from "@/api/gj/jhgl";
import {getByCode} from "@/api/sy/xtgl";
import {getDepartByCon} from "@/api/sy/depart";
import XEUtils from 'xe-utils'
import request from '@/utils/request'
import FileSaver from 'file-saver'
import XLSX from 'xlsx'

export const PageUtil = function () {
  let _that = null;
  const option = {
    height: 0,
    initMethod: [],//初始化数据调用方法定义,['getProjects','initDict','initDept']
    validate: [],//校验定义[{methodName:'initList',validateParamName:'queryParam',validateName:'project','message':'工程编号不能为空'}],暂时只支持一级属性校验
    requestOption: {},//通用接口调用方法参数
    columnOption:[],//表格列配置数据[{type:'',field:'',title:'',width:100,formatter:{dictCode:'',with:''},sortable:true,filterRender:'',props:{}]
  };

  //下拉框数据,需要的时候自己扩展
  const select = {
      //工程编号
      shipList: [],
      //计划分类
      jhfl: [],
      //图纸类型
      tzlx: [],
      //责任部门
      sscj: [],
      //业务流程状态,编制,提交,审核...
      status: [],
      //配送状态
      psStatus: [],
      comDept:[],
      outPaintCode:[],
      inPaintCode:[],
      scDept:[]
    },
    //组件中定义的table的refs
    tableName = '',
    //表格高度属性
    tableHeight = {
      height: 0,
      defaultHeight: ''
    },
    tableColumn=[],
    //查询参数
    queryParam = {
      status:'',
      project:'',
      scDept:'',
      departCode:''
    },
    //批量输入参数
    batch = {
      jsclJhsj:'',
      blwgJhsj:'',
      jjwgJhsj:'',
      zzwgJhsj:'',
      clwgJhsj:'',
      tzwgJhsj:'',
      jprkJhsj:''
    },
    //表格数据
    tableData = [],
    //api
    method = {};
  const init = function () {
    if (!this._that) {
      alert('vue对象未初始化')
      return;
    }
    if (!this.tableName){
      console.log('表格名称未配置,某些功能无法使用');
      return;
    }
    this.setTableHeight();
    //运行所有数据初始化方法
    for (const key of option.initMethod) {
      try {
        eval(option.initMethod[key]);
      }catch(e){
        alert("找不到方法");
        return;
      }
      this[key]();
    }
    window.addEventListener('resize', this.setTableHeight)
    excelUpload.parent=this;
  };
  const validate = function (methodName) {
    for (const validate of this.option.validate) {
      if (validate.methodName === methodName) {
        if (this[validate.validateParamName] && !this[validate.validateParamName][validate.validateName]) {
          this._that.$message.warning(validate.message);
          return false;
        }
      }
    }
    return true;
  };
  const initList = function () {
    if (this.validate('initList')) {
      for (const key in this.queryParam) {
        if (this.queryParam[key]===''){
          this.queryParam[key]=null;
        }
      }
      this.method.initList(this.queryParam).then(res => {
        this.tableData = res.data;
      })
    }
  };
  //偷懒,通用request
  //建议查询使用,否则可能会造成修改为''的数据不被update
  const commonRequestNonTip=function (methodName,data={},beforeRequest,callback){
    beforeRequest=beforeRequest||new Function('return true;');
    callback=callback||new Function();
    for (const key in data) {
      if (data[key]===''){
        data[key]=null;
      }
    }
    if (this.validate(methodName)&&beforeRequest(data)){
      let url=this.option.requestOption[methodName].url
      if (this.option.requestOption[methodName].method==='get'){
        url+="?"
        for (const key in data) {
          url+=key+"="+data[key]+"&";
        }
      }
      request({
        url:url,
        method:this.option.requestOption[methodName].method,
        data
      }).then(res=>{
        if (res.success){
          callback(res.data);
        }else {
          this._that.$message.warning(res.message);
        }
      })
    }
  };
  const commonRequest=function (methodName,data={},beforeRequest,callback){
    beforeRequest=beforeRequest||new Function('return true;');
    callback=callback||new Function();
    if (this.validate(methodName)&&beforeRequest(data)){
      let tips=this.option.requestOption[methodName].tips;
      if (!tips){
        tips='是否确认保存选中的数据?'
      }
      this._that.$confirm(tips, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        let url=this.option.requestOption[methodName].url
        if (this.option.requestOption[methodName].method==='get'){
          url+="?"
          for (const key in data) {
            url+=key+"="+data[key]+"&";
          }
        }
        request({
          url:url,
          method:this.option.requestOption[methodName].method,
          data
        }).then(res=>{
          if (res.success){
            callback(res.data);
          }else {
            this._that.$message.warning(res.message);
          }
        })
      }).catch((e) => {
        return false;
      });
    }
  };
  //扩展,直接传请求地址和请求方法类型,通用request
  const commonRequestEx=function (requestParams,data,beforeRequest,callback){
    beforeRequest=beforeRequest||new Function('return true;');
    callback=callback||new Function();
    if (beforeRequest()){
      const tips=requestParams.tips||'是否保存';
      this._that.$confirm(tips, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        request({
          url:requestParams.url,
          method:requestParams.method,
          data
        }).then(res=>{
          if (res.success){
            callback(res.data);
          }else {
            this._that.$message.warning(res.message);
          }
        })
      }).catch((e) => {
        return false;
      });
    }
  };
  //批量输入
  const plsr=function (){
    if (!this.tableName){
      return;
    }
    const table=this._that.$refs[this.tableName]
    const selectedList=table.getCheckboxRecords();
    if (selectedList.length<=0){
      this._that.$message.warning('请先选择批量处理的数据');
      return;
    }
    if (this.validate('plsr')){
      selectedList.forEach(l=>{
        for (const key in this.batch) {
          if (this.batch[key]){
            if (Object.prototype.toString.call(this.batch[key])==='[object Date]'){
              l[key]=XEUtils.toDateString(this.batch[key], 'yyyy/MM/dd');
              continue;
            }
            l[key]=this.batch[key];
          }
        }
      })
    }
    table.updateData(selectedList);
  };
  //直接导出表格
  const exportExcel=function (param) {
    // 表名
    const xlsxParam = { raw: true }
    var wb = XLSX.utils.table_to_book(document.querySelector('.'+param.tableName), xlsxParam)

    var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
    try {
      FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), param.fileName+'.xlsx')
    } catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
    return wbout
  }
  //表格列配置数据[{type:'',field:'',title:'',width:100,formatter:{dictCode:'',with:''},sortable:true,filterRender:'',props:{}]
  const setTableColumn=function (){
    this.option.columnOption.forEach(c=>{
      const column={};
      if (c.type){
        column.type=c.type;
      }
      if (c.field){
        column.field=c.field;
      }
      if (c.title){
        column.title=c.title;
      }
      c.width=100;
      if (c.width){
        column.width=c.width;
      }
      if (c.formatter){
        column.formatter.push(c.formatter.dictCode)
        if (c.formatter.with){
          column.formatter.push(c.formatter.with)
        }
      }
      if (c.sortable){
        column.sortable=true
      }
      if (c.filterRender){
        column.filters=[{ data: { checks: [], sVal: '', sMenu: '', fType1: '', fVal1: '', fMode: 'and', fType2: '', fVal2: '' } }]
        column.filterRender={name:c.filterRender}
      }
      this.tableColumn.push(column);
    })
  }
  //设置表格高度
  const setTableHeight=function () {
    if (!option.height){
      console.log('未配置form高度,table高度无法初始化')
      //this._that.$message.error('未配置form高度,table高度无法初始化');
      return;
    }
    tableHeight.height = window.innerHeight - option.height;
    tableHeight.defaultHeight = tableHeight.height + 'px';
  };
  //加载工程编号下拉框数据
  const getProjects=function (fieldName='project'){
    getShipAll().then(res => {
      const _that=this._that;
      if (res.success) {
        this.select.shipList = res.data;
        this.initEditRenderOption(this.select.shipList,fieldName,'project','project')
      } else {
        _that.$message.error(res.message);
      }
    })
  };
  // //加载字典下拉框,转码
  const initDict=function (){
    for (const dict of this.option.dict) {
      if (dict.default){
        this.queryParam[dict.name]=dict.default;
      }
      getByCode({dictCode:dict.code}).then(res=>{
        let dictData=res.data;
        if (dict.startWith){
            dictData=dictData.filter(dictItem=>{
            return dictItem.itemCode.startsWith(dict.startWith)
          })
        }
        this.select[dict.name]=dictData;
        this.initEditRenderOption(dictData,dict.render,'itemValue','itemCode')
      })
    }
  };
  const initDept=function (){
    for (const dept of this.option.dept) {
      getDepartByCon({parentCode:dept.code}).then(res=>{
        let deptData=res.data;
        if (dept.name){
          this.select[dept.name]=deptData;
        }
        if (dept.render){
          this.initEditRenderOption(deptData,dept.render,'departName','departCode')
        }
        if (dept.default&&!this.queryParam[dept.name]){
          this.queryParam[dept.name]=dept.default;
        }
      })
    }
  };

  const initEditRenderOption=function (data,fieldName,label,value){
    if (!this.tableName){
      return;
    }
    const table=this._that.$refs[this.tableName]
    const edit=table.getColumnByField(fieldName)
    if (edit&&edit.editRender&&edit.editRender.options){
      const optionList = []
      for (const item of data) {
        const temp = { label: item[label], value: item[value] }
        optionList.push(temp)
      }
      edit.editRender.options=optionList;
    }
  };
  const beforexx=function (){
    console.log(this)
  }
  const selectChange=function (row) {
    this._that.$refs[tableName].clearActived() // 清除单元格激活状态
    this._that.$refs[tableName].setActiveCell(row.row, row.column.property) // 设置单元格为激活状态
  };
  const excelUpload= {
    parent:'',
    option: {
      uploadAction: '',
      params: {}
    },
    beforeUpload(file,callBack) {
      if (!this.option.uploadAction){
        console.log('excelUpload.option.uploadAction,上传地址未定义')
        return false;
      }
      let fd = new FormData()
      fd.append('file', file);
      for (const key in this.option.params) {
        fd.append(key, this.option.params[key]);
      }
      callBack=callBack||new Function()
      upload(this.option.uploadAction, fd).then(res => {
        if (res.data.successData) {
          this.parent.tableData = res.data.successData;
        } else {
          this.tableData = res.data
        }
      });
      return false;
    },
    handleAvatarSuccess(res, file) {
      endLoading();
    }
  };
  return {
    _that,
    option,
    select,
    tableName,
    tableHeight,
    queryParam,
    batch,
    tableData,
    method,
    validate,
    init,
    initList,
    commonRequest,
    commonRequestNonTip,
    commonRequestEx,
    getProjects,
    initDict,
    initDept,
    initEditRenderOption,
    plsr,
    beforexx,
    excelUpload,
    exportExcel,
    selectChange,
    setTableHeight
  }
}
