import Loading from '_c/loading'
import {mapMutations} from 'vuex'
import {button as buttonList} from '@/locale/lang/zh-CN.js'
import {request} from "@/api/base";
import {
  getTagNavListFromLocalstorage,
  sessionRead
} from "@/libs/base/util";

/**
 * @desc   : 新建编辑页面的混入
 * @author : 周兴
 * @date   : 2022/12/8 10:33
 */
export const formMixin = {
  components: {
    Loading
  },
  props: {
    type: {
      type: String
    },
  },
  data() {
    let self = this;
    return {
      loading: false,
      modalVisible: false, // 弹框是否显示
      typeData: '',
      currentTableIndex: null,
      initDataFlag: true,  // 初始化数据标识
      lastRoute: {},       // 记录上次打开的路由
      pageInfo: {
        total: 0,
        pageSize: self.$config.pageSize,
        currentPage: 1
      },
      tableDataSocial: [], // 原始数据
      //要传给下拉表格的输入的条件
      tableModalCond: null,
      tableHeight: 600,
      errMessage: {},// 错误信息
      params: {},// 保存时赋值的参数
      focusItem: '', // 进入页面，光标落在的组件
      editKeys: [], // 批量编辑信息
      editIndex: 1, // 批量编辑的序号，默认是第一个
      resizeTableFlag: false,//是否重新计算table的高度
      morePanelFlag: false,// 多个panel需要平分
      formData: null, //新建编辑实体
      formDataInit: {},  // 记录页面初始化的数据
      primaryKey:null,
    }
  },
  watch: {
    '$route'(newRoute) {
      // console.log('b',newRoute)
      let currentRoute = {}
      if (newRoute.params && newRoute.params.id) {
        currentRoute = {id: this.$route.params.id + '', name: this.$route.name};
      } else if (newRoute.query && newRoute.query.editId) {
        currentRoute = {id: this.$route.query.editId + '', name: this.$route.name};
      }
      // 只有路由不相同的时候才会重新查询明细
      if (currentRoute && this.lastRoute && currentRoute.name === this.lastRoute.name
        && currentRoute.id !== this.lastRoute.id) {
        this._detail(currentRoute.id)
        // 用于记录当时的路由
        this.lastRoute = currentRoute;
      }
    },
  },
  methods: {
    ...mapMutations([
      'closeTag',
      'setTagNavList'
    ]),
    /**
     * @desc   : 打开窗体
     * @author : 周兴
     * @param  : routeUrl :类型（config中的routeUrl），tableRef：勾选列表的ref名称，isMustChooseFlag：是否需要校验是否选择了数据
     * @date   : 2022/12/9 8:36
     */
    open(routeUrl, tableRef = 'table-select', isMustChooseFlag = true) {
      if (!routeUrl || !routeUrl.key) {
        return;
      }
      let name = routeUrl.key
      // 页面校验
      this._openValidData(name).then(res => {
        if (!res) {
          return;
        }
        // 执行方法
        if (routeUrl.method && this[routeUrl.method]) {
          // 执行方法
          this[routeUrl.method]();
        }
      })
    },
    /**
     * @desc   : 打开窗体时校验数据（不给外部调用）
     * @author : 周兴
     * @date   : 2022/12/9 8:52
     */
    _openValidData(name) {
      return new Promise(resolve => {
        if (this.openValidData) {
          let flag = this.openValidData(name);
          resolve(flag);
        } else {
          resolve(true);
        }
      })
    },
    /**
     * @desc   : 编辑进行翻页
     * @author : 周兴
     * @date   : 2023/2/9 16:55
     */
    editPageChange(e) {
      if (this.editKeys && this.editKeys[e - 1]) {
        this._detail(this.editKeys[e - 1], event)
      }
      setTimeout(() => {
        this.editIndex = e;
      }, 200)
    },
    /**
     * @desc   : 监听全局键盘按钮按下的事件
     * @author : 周兴
     * @date   : 2022/3/4 16:57
     */
    addKeyBoardEvent() {
      let code = 0
      let self = this
      // console.log('buttonList',buttonList)
      document.onkeydown = function (e) {
        const evn = e || event
        const key = evn.keyCode || evn.which || evn.charCode
        // alt：code = 18
        if (key === 18) {
          code = 18
        }
        // 查询子模块是否开着
        let currentModal = null
        let modalName = ''
        for (let it of Object.keys(self.$refs)) {
          // console.log('3424',it,self.$refs[it])
          // 如果放大镜的查询开着就先优先放大镜
          if (it.startsWith('modal_select') && self.$refs[it] && self.$refs[it].showModal) {
            currentModal = self.$refs[it]
            break
          }
          // 如果没有放大镜的查询，那么就看这个界面的查询
          else if (it.startsWith('modal_') && self.$refs[it] && self.$refs[it].showModal) {
            modalName = it
            currentModal = self.$refs[it]
            break
          }
          // 查看是否有按钮区域
          else if (it === 'saveButton') {
            currentModal = self.$refs[it]
            break
          }
        }
        // console.log('3334',currentModal,self.$refs,modalName)
        // Q：code = 81 查询
        let btList = Object.values(self.$config.button);
        btList.forEach(forIt => {
          if (code === 18 && forIt.hotKey?.toLowerCase() === e.key.toLowerCase()) {
            e.returnValue = false
            // 走一览查询
            if (currentModal != null && currentModal) {
              if (self.$refs[forIt.name]) {
                self.$refs[forIt.name].$el.click()
              } else if (modalName && self.$refs[modalName] &&
                self.$refs[modalName].$refs[forIt.name]) {
                self.$refs[modalName].$refs[forIt.name].$el.click()
              }
              // 兼容放大镜
              else if (currentModal.$refs[forIt.name]) {
                currentModal.$refs[forIt.name].$el.click()
              } else {
                // todo 兼容modal_search
                if (self.$refs.modal_search && self.$refs.modal_search.$refs[forIt.name]) {
                  self.$refs.modal_search.$refs[forIt.name].$el.click();
                }
              }
            } else {
              if (self.$refs[forIt.name]) {
                self.$refs[forIt.name].$el.click()
              }
            }
          }
        })
      }
      // 监听全局键盘按钮松开的事件
      document.onkeyup = function (e) {
        const evn = e || event
        const key = evn.keyCode || evn.which || evn.charCode
        if (key === 18) {
          code = 0
        }
        // 一秒钟失效，避免因为按了alt+tab之后再回来，按其他什么英文字母都不好使了的问题
        setTimeout(() => {
          code = 0
        }, 1000)
      }
    },
    /**
     *   @author : 寇珊珊
     *   @date   : 2022/3/22 10:54
     *   @desc   : 滚动后模拟点击事件，模拟关闭poptip
     */
    scroll(e) {
      // 下拉不触发
      if (e == undefined || (e.target && e.target.className !== 'xm-option-content')) {
        e?.target.click()
        // 解决下拉菜单pop不消失的问题
        if (this.$refs['saveButton']) {
          this.$refs['saveButton'].focus()
        }
      }
    },
    /**
     * @desc   : 关闭窗体
     * @author : 周兴
     * @date   : 2022/6/21 19:18
     */
    close(questionFlag = true, nextRoute = null) {
      // 判断页面是否需要关闭提示
      if (questionFlag && this.$route.meta && this.$route.meta.closeQuestion) {
        this.$IBMessage({
            content: this.$t('Q_002', {'param': this.$t('close')}),
            title: this.$t('systemQuestion')
          },
          {
            ok: () => {
              // 执行关闭
              this._close(nextRoute);
            },
            cancel: () => {
            }
          })
      } else {
        // 执行关闭
        this._close(nextRoute);
      }
    },
    /**
     * @desc   : 执行关闭窗体
     * @author : 周兴
     * @date   : 2023/7/14 17:33
     */
    _close(nextRoute) {
      this.editKeys = [];
      this.formData = {};
      this.closeTag(this.$route);
      // 如果下一个路由打开，就跳转到下一个路由
      if (nextRoute) {
        this.$router.push(nextRoute);
      }
    },
    /**
     * @desc   : 保存
     * @author : 周兴
     * @param  : arg:外部参数，可为空
     * @date   : 2022/12/8 13:12
     */
    save(arg) {
      // 1、校验
      this._validData(arg).then(res => {
        if (!res) {
          return;
        }
        this.loading = true;
        // 2、给参数赋值
        this.setParams(arg)
        // 3、保存数据
        this._saveData(arg).then(result => {
          // 新建成功
          if (result.code === this.$config.SUCCESS_CODE) {
            // 提示信息
            this.$Message.success(this.$t('I_001', {'param': this.$t(this.typeData)}))
            // 新建清空当前窗体
            if (this.typeData === this.$config.formMode.add
              || this.typeData === this.$config.formMode.addTogether
              || this.typeData === this.$config.formMode.moldDamage) {
              this._clear();
            } else {
              // 如果是多个数据进行编辑不能关页面
              if (this.editKeys && this.editKeys.length > 1) {
                if (this.editIndex + 1 <= this.editKeys.length) {
                  // 跳转到下一条数据
                  this.editPageChange(this.editIndex + 1)
                }
              } else {
                // 单一页面编辑关闭窗体
                this.close(false);
              }
            }
          } else {
            // 如果不成功就提示错误信息
            this.$Message.warning(result.message)
          }
          this.loading = false
        });
      });
    },
    /**
     * @desc   : 校验，（不给外部调用）
     * @author : 周兴
     * @date   : 2022/12/8 14:13
     */
    _validData(arg) {
      return new Promise(resolve => {
        if (this.validData) {
          let flag = this.validData(arg);
          resolve(flag);
        } else {
          resolve(true);
        }
      })
    },
    /**
     * @desc   : 给参数赋值（不给外部调用）
     * @author : 周兴
     * @date   : 2022/12/8 14:33
     */
    _saveData(arg) {
      return new Promise(resolve => {
        let res = this.saveData(arg);
        resolve(res);
      })
    },
    /**
     * @desc   : 清空保存参数
     * @author : 周兴
     * @date   : 2024/1/18 13:05
     */
    _clear() {
      // 清空表单
      if (this.formDataInit) {
        this.formData = {...this.formDataInit}
      }
      // 调用页面的清空
      if (this.clear) {
        this.clear();
      }
    },
    /**
     * @desc   : 执行数据库方法
     * @author : 周兴
     * @param  : service：那个实体，$service;method：方法名；params：参数
     * @date   : 2022/12/12 13:33
     */
    excute(service, method, params) {
      if (service && method) {
        let res = request(service.prefix + method, params)
        if (res) {
          return res;
        }
      }
    },
    /**
     * @desc   : 执行数据库方法
     * @author : 周兴
     * @param  : service：那个实体，$service;method：方法名；params：参数，要拼接到方法上
     * @date   : 2022/12/12 13:33
     */
    excuteNoParam(service, method, params = []) {
      if (service && params && params.length > 0) {
        let url = service.prefix + (method || '');
        let par = ''
        params.forEach(it => {
          par += '/' + it
        })
        let res = request(url + par, params,null,null)
        if (res) {
          return res;
        }
      }
    },
    /**
     * @desc   : 打开搜索重新计算表格高度
     * @author : 周兴
     * @date   : 2023/4/18 11:22
     */
    changeCollapse() {
      setTimeout(() => {
        this.resizeTable() // 重新计算表格高度
      }, 300)
    },
    /**
     * @desc   : desc
     * @author : 周兴
     * @date   : 2023/4/18 9:59
     */
    resizeTable() {
      this.scroll(); // 调用滚动，隐藏弹框
      if (this.resizeTableFlag) {
        this.$nextTick(() => {
          let mainHeight = 0;
          // let mainDiv = document.getElementsByClassName('main-div');
          // if (mainDiv && mainDiv.length > 0) {
          //   mainHeight = mainDiv[0].clientHeight
          // }
          mainHeight = document.documentElement.clientHeight - 40
          let footInfoHeight = 0
          // 底边保存按钮的高度
          if (this.$refs.saveButton) {
            footInfoHeight = this.$refs.saveButton.$el.clientHeight
          }
          let panels = 0;
          if (this.$refs.collapse && this.$refs.collapse.$children) {
            let childrens = this.$refs.collapse.$children;
            if (!this.averageHeightFlag) {
              // 不需要最後一個
              for (let i = 0; i < childrens.length - 1; i++) {
                panels += childrens[i].$el.clientHeight;
              }
            } else {
              // 是否要平均分
              for (let i = 0; i < childrens.length; i++) {
                if (!childrens[i].averageHeightFlag) {
                  panels += childrens[i].$el.clientHeight;
                }
              }
            }
          }
          let formRefHeight = 0;
          if (this.$refs.formRef) {
            formRefHeight = this.$refs.formRef.clientHeight
          }
          let toolsHeight = 0;
          if (document.getElementById('BaseIndexButtonGroup') != null) {
            toolsHeight = document.getElementById('BaseIndexButtonGroup').offsetHeight + 10
          }
          console.log('toolsHeight', mainHeight, footInfoHeight, panels)
          this.tableHeight = mainHeight - footInfoHeight - panels - toolsHeight - formRefHeight - 70
        })
      }
    },
    /**
     * @desc   : 查询明细的方法（不给外部调用）
     * @author : 周兴
     * @date   : 2022/12/8 17:56
     */
    _detail(id) {
      console.log('id', id)
      this.loading = true;
      this.detail(id)?.then(res => {
        if (res.code === this.$config.SUCCESS_CODE && res.data) {
          // 给变量赋值
          this.setValuesByEdit(res.data)
          this.$emit('on-detail', res.data)
        } else {
          this.$Message.warning(res.message)
        }
        // // 如果不为空，那么需要把置为false
        // if (editPage) {
        //   setTimeout(()=>{
        //     editPage.disabled = false;
        //   },500)
        // }
        setTimeout(() => {
          this.loading = false
        }, 300)
      })
    },
    /**
     * @desc   : 光标聚焦到第一个组件
     * @author : 周兴
     * @date   : 2022/12/30 10:45
     */
    focus() {
      if (this.focusItem && this.$refs[this.focusItem] && this.$refs[this.focusItem].focus) {
        this.$nextTick(() => {
          this.$refs[this.focusItem].focus();
        })
      }
    },
    /**
     * @desc   : desc
     * @author : 周兴
     * @date   : 2023/4/27 8:43
     */
    handleVisibleModal(e) {
      if (e) {
        this.modalVisible = true;
      } else {
        this.modalVisible = false;
      }
    },
    /**
     * @desc   : 处理编辑信息
     * @author : 周兴
     * @date   : 2023/2/10 10:24
     */
    handleEditInfo() {
      // 读取编辑信息
      let editInfo = this.$route.params;
      if (editInfo && editInfo.editKeys) {
        this.editKeys = editInfo.editKeys
      }
    },
    /**
     * @desc   : 记录路由的父级
     * @author : 周兴
     * @date   : 2023/12/22 16:07
     */
    handleRouteParent() {
      let name = sessionRead(this.$route.name + '-parent');
      if (name) {
        this.$set(this.$route.meta, 'parentPath', name)
        let tagList = getTagNavListFromLocalstorage() || []
        let filters = tagList.filter(it => it.name == this.$route.name);
        if (filters && filters.length > 0) {
          this.$set(filters[0].meta, 'parentPath', name)
          this.setTagNavList(tagList)
        }
      }
    },
  },
  created() {
    this.handleEditInfo();// 处理编辑信息
    // 记录路由的父级
    this.handleRouteParent();
    // 页面如果有加载数据源的方法就会调用
    if (this.initDataFlag && this.initData) {
      this.initData();
    }
    this.typeData = this.type;
    console.log('00000',this.type);
    if (this.type === this.$config.formMode.edit
      || this.type === this.$config.formMode.detail
      || this.type === this.$config.formMode.handle
      || this.type === this.$config.formMode.unFreeze
      || this.type === this.$config.formMode.addOrderOut
      || this.type === this.$config.formMode.addOrderReturn
      || this.type === this.$config.formMode.addOutReturn) {
      this._detail(this.$route.params.id)
      // 用于记录当时的路由
      this.lastRoute = {id: this.$route.params.id + '', name: this.$route.name};
    } else if (this.type == this.$config.formMode.add || this.type == this.$config.formMode.addTogether) {
      // 如果新建时需要设置默认值
      if (this.setDefaultValue) {
        this.setDefaultValue();
      }
      if (this.$route.params && this.$route.params.id) {
        if(this.type != this.$config.formMode.add){
          this._detail(this.$route.params.id)
        }
        // 用于记录当时的路由
        this.lastRoute = {id: this.$route.params.id + '', name: this.$route.name};
      }

      setTimeout(() => {
        this.resizeTable() // 重新计算表格高度
      }, 300)
    }
    //监听form页面滚动
    this.$nextTick(() => {
      if (this.$refs.mainDiv) {
        this.$refs.mainDiv.addEventListener('mousewheel', this.scroll)
        this.$refs.mainDiv.addEventListener('DOMMouseScroll', this.scroll)
      }
    })
  },
  beforeDestroy() {
    if (this.$refs.mainDiv) {
      this.$refs.mainDiv.removeEventListener('mousewheel', this.scroll)
      this.$refs.mainDiv.removeEventListener('DOMMouseScroll', this.scroll)
    }
    window.removeEventListener('resize', this.resizeTable)
  },
  mounted() {
    this.focus();   // 光标聚焦到第一个组件
    //监听窗口变化
    window.addEventListener('resize', this.resizeTable)
    if (this.formData) {
      this.formDataInit = {...this.formData};
    }
  },
  activated() {
    let self = this
    self.addKeyBoardEvent()
    this.focus();   // 光标聚焦到第一个组件
    setTimeout(() => {
      this.resizeTable() // 重新计算表格高度
    }, 300)
  }
}
