<template>
  <div :style="pageTableHeight" class="TablePage">
    <PublicPageHeader class="TablePage_header" :page-title="dataTitle ? dataTitle : pageTitle">
      <AuthButton :auth="pageAuthBtnAdd" />
      <AuthButton :auth="pageAuthBtnQuery" />
    </PublicPageHeader>
    <div :style="pageTableContentHeight" class="TablePage_content flex-wrap">
      <div v-if="treeData.length" class="TablePage_content_left">
        <PublicPageTree :tree-data="treeData" @treeNodeClick="treeNodeClick" />
      </div>
      <div :class="treeData.length ? 'tableSacle' : 'tableAuto'" class="TablePage_content_right">
        <PublicPageTable :loading="loading" :table-cols="tableCols" :table-btns="authBtns" :data="tableData" :header-cell-class-name="headerCellClass" :row-class-name="rowClass" :cell-class-name="cellClass" :formatter="tableFormatter" show-summary @mounted="tableMountedHandler" @load="load" @cell-click="cellClickHandler" @handleEdit="handleEdit" @handleOther="handleOther" @handleRemove="handleRemove" />
      </div>
    </div>
    <div class="TablePage_dialog">
      <!--新增/编辑-->
      <PublicPageDialog :dialog-title="tableTitle" dialogSize="630px" :dialog-drawer="flag" @handleClose="submitClickClose('ruleForm')" @handleSubmit="submitClickHandler">
        <PublicPageForm ref="ruleForm" :label-width="labelWidth" :form-item="formItem" :form-data="tableForm" />
      </PublicPageDialog>
      <!--删除-->
      <PublicPageDialog dialog-title="删除" :dialog-drawer="rmFlag" @handleClose="rmFlag = false" @handleSubmit="tableRemove">
        <div class="content del-content">
          <span class="el-icon-error error r10"></span>您是否确认删除<span class="error l10">{{ rmTitle }}</span>
          ？
        </div>
      </PublicPageDialog>
      <!--高级查询-->
      <PublicPageDialog dialog-title="高级查询" dialogSize="600px" :dialog-drawer="advancedDrawer" @handleClose="advancedDrawer = false" @handleSubmit="advancedTable('advancedDialogForm')">
        <AdvancedQuery ref="advancedDialogForm" @getAdvancedQueryData="getAdvancedQueryData" />
        <template slot="d_foot">
          <el-button size="small" @click="queryCollect('advancedDialogForm')" type="primary">收藏</el-button>
        </template>
      </PublicPageDialog>
    </div>
  </div>
</template>

<script>
import PublicPageHeader from '@/components/PublicPageHeader'
import PublicPageTable from '@/components/SimpleTable'
import PublicPageTree from '@/components/publicPageTree'
import PublicPageDialog from '@/components/PublicPageDialog'
import PublicPageForm from '@/components/publicPageForm'
import AdvancedQuery from '@/components/AdvancedQuery'
import AuthButton from '@/components/AuthButton'
import { mapGetters } from 'vuex'
import { Query, newData, modifyData, moveData } from "@/api/webApi"

export default {
  name: 'TablePage',
  components: { PublicPageHeader, PublicPageTable, PublicPageDialog, PublicPageTree, PublicPageForm, AdvancedQuery, AuthButton },
  props: {
    dataTitle: {
      type: String,
      default: ''
    },
    msgContent: {
      type: Object,
      default: () => new Object()
    }
  },
  data () {
    return {
      page: 0, //当前table页面
      noMore: false, //当前table是否加载到最后开关
      loading: false, //页面加载
      advancedDrawer: false, //高级查询弹框开关
      defaultfilter: { 1: 1 }, //默认查询参数
      pageQuery: {},
      dialogFlag: false,
      pageTitle: '', //页面名称
      treeData: [], //tree数据
      treeParameters: {}, //tree传递参数
      tableCols: [], //表头数据
      tableData: [], //表格数据
      tableBtns: [], //表格按钮权限
      authBtns: [], //表格里面的操作按钮
      dataContent: {}, //表格查询数据
      pageServiceId: null, //表格serviceid
      formItem: [], //弹框表单渲染数据
      flag: false, //弹框表单开关
      tableType: "add", //弹框表单弹框类型
      tableTitle: "新增", //弹框表单标题
      tableForm: {}, //弹框表单数据
      rmFlag: false, //删除弹框开关
      rmTitle: '', //删除弹框标题
      tableObj: {}, //删除数据
      tableOptions: {}, //表单数据下拉
      labelWidth: '120px', //表单文字距离
      fromDataReqCatch: [], //表单规则缓存
    }
  },
  computed: {
    ...mapGetters(['authArrs']),
    pageTableHeight () {
      if (Object.keys(this.msgContent).length) return 'height:100%'
      return ''
    },
    pageTableContentHeight () {
      if (Object.keys(this.msgContent).length) return 'height:calc(100% - 60px)'
      return ''
    },
    pageAuthBtnQuery () {
      return this.tableBtns.filter(item => item.servicetype == 1)[0]
    },
    pageAuthBtnAdd () {
      return this.tableBtns.filter(item => item.servicetype == 2)[0]
    },
    pageAuthBtnEdit () {
      return this.tableBtns.filter(item => item.servicetype == 3)[0]
    },
    pageAuthBtnDel () {
      return this.tableBtns.filter(item => item.servicetype == 4)[0]
    },
    pageAuthBtnOther () {
      return this.tableBtns.filter(item => item.servicetype == 5)[0]
    },
  },
  mounted () {
    this.pageInit()
  },
  methods: {
    //页面初始化
    pageInit () {
      //获取页面查询参数
      const { query } = this.$route
      this.pageQuery = query
      //获取页面配置
      const { pagecode, qid, auth_id } = this.$route.meta
      //获取页面权限类型组件  pagetype 1模块  2页面  3按钮 4表格 5树形  6弹窗
      const pageAuths = this.authArrs
      if (!pageAuths.length) return
      //获取当前页面权限类型
      const pageAuthArrs = pageAuths.filter(item => item['superiorid'] == auth_id)
      if (!pageAuthArrs.length) return
      //获取tree权限
      const pageAuthtrees = pageAuthArrs.filter(item => item.pagetype == 5)
      if (pageAuthtrees?.length) this.getPageTreeSetting(pageAuths, pageAuthtrees)
      //获取table权限
      const pageAuthtables = pageAuthArrs.filter(item => item.pagetype == 3)
      if (pageAuthtables?.length) this.getPageTableSetting(pageAuths, pageAuthtables)
      //获取按钮权限
      const pageAuthbtns = pageAuthArrs.filter(item => item.pagetype == 4)
      if (pageAuthbtns?.length) this.getPageBtnSetting(pageAuthbtns)
    },
    //根据页面tree设置数据
    getPageTreeSetting (pageAuths, pageAuthtrees) {
      const { passparameters } = pageAuthtrees[0]
      this.treeParameters = passparameters
      this.treeData = pageAuthtrees
    },
    //根据页面table设置数据
    getPageTableSetting (pageAuths, pageAuthtables) {
      const authTableObj = pageAuthtables[0]
      //获取当前页面table的配置
      const { pagename, pageconfigurationid, serviceid, pagecode, userpermissionsid, defaultfilter } = authTableObj
      //获取当前页面table的按钮权限
      const currPageBtns = pageAuths.filter(item => item['superiorid'] == pageconfigurationid)
      if (currPageBtns?.length) this.tableBtns.push(...currPageBtns)
      this.authBtns = pageAuths.filter(item => item.superiorid == pageconfigurationid && item.pagetype == 4)
      this.pageServiceId = Object.keys(this.msgContent).length ? this.msgContent.serviceid : serviceid;
      this.pageTitle = pagename
      this.defaultfilter = Object.keys(this.pageQuery).length ? this.pageQuery : defaultfilter ? this.formatDefault(defaultfilter, authTableObj) : { 1: 1 }
      this.getColumnData(pagecode, userpermissionsid)
    },
    //根据页面按钮设置数据
    getPageBtnSetting (pageAuthbtns) {
      this.tableBtns.push(...pageAuthbtns)
    },
    //获取表头数据
    async getColumnData (pagecode, id) {
      try {
        const { code, returnData } = await Query({
          serviceid: '3',
          datacontent: { filter: Object.keys(this.msgContent).length ? this.msgContent : { pagecode } },
          event: "0"
        });
        if (code == 0) {
          if (returnData?.length) {
            this.$store.dispatch('auth/changeAuthMsg', returnData)
            const tableColsCopy = _.cloneDeep(returnData).filter((item) => item.isdisplay == 2);
            const tableColsCopyOrder = _.orderBy(tableColsCopy, ['displaynumber'], ['asc']);
            const formItemCopy = _.cloneDeep(returnData).filter((item) => item.isdisplay == 2 || item.isdisplay == 3);
            this.formItem = _.orderBy(formItemCopy, ['displaynumber'], ['asc']);
            this.tableCols = tableColsCopyOrder;
          }
        } else {
          this.$message.error("获取表头数据失败");
        }
      } catch (error) {
        console.log(error)
      }
    },
    //获取tree点击
    treeNodeClick (data) {
      const filterItem = this.formatDefault(this.treeParameters, data)
      if (!Object.keys(filterItem).length) return
      this.defaultfilter = filterItem
      this.queryTableData(true)
    },
    //格式化传递参数数据
    formatDefault (item, data = {}) {
      if (typeof item != 'string') return {}
      const filterItem = {}
      const parameters = item.replace('{', '').replace('}', '')
      const parametersSplit = parameters?.split(',')
      parametersSplit.map(item => {
        const [key, val] = item?.split(':')
        filterItem[key] = data[val]
      })
      return filterItem
    },
    //表单-新增
    handleAdd () {
      const { openmode, pageroute } = this.pageAuthBtnAdd
      if (!openmode) return
      if (openmode != 2) this.autoBtnClick(openmode, pageroute)
      this.flag = true;
      this.tableType = "add";
      this.tableTitle = "新增";
      this.tableForm = {};
    },
    //表格-编辑
    handleEdit (row) {
      const { openmode, pageroute } = this.pageAuthBtnEdit
      if (!openmode) return
      if (openmode != 2) this.autoBtnClick(openmode, pageroute)
      this.flag = true;
      this.tableType = "edit";
      this.tableTitle = "编辑";
      this.tableForm = _.cloneDeep(row);
    },
    //表格-其他类型按钮操作
    handleOther (row, auth) {
      const { openmode, pageroute, passparameters } = this.pageAuthBtnOther
      if (!openmode) return
      if (openmode != 2) this.autoBtnClick(openmode, pageroute, passparameters, row)
    },
    //表格-删除
    handleRemove (row) {
      const { columncode } = this.tableCols[0]
      const { openmode, pageroute } = this.pageAuthBtnDel
      if (!openmode) return
      if (openmode != 2) this.autoBtnClick(openmode, pageroute)
      this.rmFlag = true;
      this.rmTitle = row[columncode];
      this.tableObj = row;
    },
    //表格-删除-确认
    tableRemove () {
      this.generalDataReception(3, this.tableObj);
    },
    // 新增/编辑-取消
    submitClickClose (formName) {
      this.flag = false
      this.$refs[formName].restForm()
    },
    // 新增/编辑-确认
    submitClickHandler () {
      const flag = this.$refs["ruleForm"].submitClickHandler()
      if (flag) this.tableType == "add" ? this.generalDataReception(1, this.tableForm) : this.generalDataReception(2, this.tableForm)
    },
    formatChange (data, event, key) {
      const datas = []
      const flag = Array.isArray(data)
      if (flag) {
        for (let i = 0; i < data.length; i++) {
          let obj = {}
          if (event == 1) {
            obj.value = data[i]
          } else if (event == 2) {
            obj.value = data[i]
            obj.filter = {}
            if (Array.isArray(key)) {
              const keys = []
              const vals = []
              obj.filter = []
              for (let j = 0; j < key.length; j++) {
                const dep = key[i]
                keys.push(Object.keys(dep))
                vals.push(Object.values(dep))
              }
              obj.filter.push(nobj)
              if (obj.value.hasOwnProperty(keys[i])) {
                delete obj.value[keys[i]]
              }
            } else {
              obj.filter[key] = data[i][key]
              if (obj.value[key]) {
                delete obj.value[key]
              }
            }
          } else {
            obj = data[i]
          }
          datas.push(obj)
        }
      } else {
        let obj = {}
        obj.filter = {}
        if (event == 1) {
          obj.value = data
        } else if (event == 2) {
          obj.value = data
          obj.filter[key] = obj.value[key]
          if (obj.value[key]) {
            delete obj.value[key]
          }
        } else {
          obj = data
        }
        datas.push(obj)
      }
      return datas
    },
    //表格-增/删/改
    async generalDataReception (event, data, key) {
      try {
        const params = {
          serviceid: this.pageServiceId,
          datacontent: this.formatChange(data, event, key),
          event: `${event}`,
        };
        const { code } =
          event == 1
            ? await newData(params)
            : event == 2
              ? await modifyData(params)
              : await moveData(params);
        if (code == 0) {
          this.$message.success("操作成功");
          this.flag = false;
          this.rmFlag = false;
          this.tableObj = {};
          this.tableForm = {};
          this.resetTable();
          this.load();
          // this.$router.go(0);
        } else {
          this.$message.error("操作失败");
          this.flag = false;
          this.rmFlag = false;
          this.tableObj = {};
          this.tableForm = {};
        }
      } catch (error) {
        this.flag = false;
        this.rmFlag = false;
        this.tableObj = {};
        this.tableForm = {};
      }
    },
    autoBtnClick (id, url, passparameters, row = {}) {
      switch (Number(id)) {
        case 1:
          if (passparameters && Object.keys(row).length) {
            const filterItem = this.formatDefault(passparameters, row)
            this.$router.push({
              path: url,
              query: filterItem
            })
          }
          break;
        case 2:
          this.$router.push(url)
          break;
        default:
          break;
      }
    },
    //高级查询-弹框打开
    handleQuery () {
      const { openmode, pageroute } = this.pageAuthBtnQuery
      if (!openmode) return
      if (openmode != 3) this.advancedDrawer = true // this.autoBtnClick(openmode, pageroute)
      this.dialogFlag = true
    },
    //高级查询-确定
    advancedTable (refName) {
      this.$refs[refName].advancedQueryHandler()
    },
    //高级查询-确定-数据
    getAdvancedQueryData (dataRules) {
      console.log(dataRules)
    },
    //高级查询-收藏
    queryCollect (refName) {
      this.$refs[refName].advancedQueryCollect()
    },
    // 给表头单元格加上 ascending 或 descending 使用 element 自带的排序箭头变色
    headerCellClass () {
      return function ({ row, column, rowIndex, columnIndex }) {
        const classes = []
        const rule = this.tableDataSortRules[column.property]
        if (rule) {
          classes.push(rule)
        }
        return classes.join(' ')
      }
    },
    //添加-表格-行样式
    rowClass () {
      return function ({ row, rowIndex }) {
        const classes = []
        if (row.deleted === 'DEL') {
          classes.push('bgl-deleted')
        }
        return classes.join(' ')
      }
    },
    //添加-表格-单元格样式
    cellClass () {
      return function ({ row, column, rowIndex, columnIndex }) {
        const classes = []
        if (
          [
            'flightNO',
            // 'passengerName',
            'bagSN',
            'U_Device_ID',
            'preFlightNO',
            'transferFlightNO',
          ].includes(column.property) &&
          row[column.property] &&
          row[column.property] !== 'FBULK'
        ) {
          classes.push('cell-click')
          if (
            this.clickedCells.some(
              cell =>
                cell.pageName === 'advance' &&
                Object.entries(cell.row).every(
                  ([key, value]) => row[key] === value
                ) &&
                cell.columnProp === column.property
            )
          ) {
            classes.push('cell-clicked')
          }
        }
        return classes.join(' ')
      }
    },
    //添加-表格-单元格-点击事件
    cellClickHandler (row, column, cell, event) { },
    tableFormatter () {
      return function (row, column, cellValue) {
        switch (column.property) {
          case 'departureTime':
            return (cellValue ?? '').replace('T', ' ')
          case 'deleted':
            return cellValue === 'DEL' ? cellValue : ''
          case 'activated':
            return Number(cellValue) === 1 ? '激活' : '未激活'
          default:
            return cellValue ?? ''
        }
      }
    },
    tableMountedHandler (refName, ref) {
      this.$refs[refName] = ref
    },
    resetTable () {
      this.dataContent = {}
      this.page = 0;
      this.noMore = false;
      this.tableData = [];
    },
    load () {
      if (this.noMore || this.loading) {
        return
      }
      this.queryTableData()
    },
    async queryTableData (jumpSing = false) {
      if (jumpSing) {
        const initialize = _.once(this.resetTable)
        initialize()
      }
      this.loading = true;
      const datacontent = { filter: this.defaultfilter }
      try {
        const { code, returnData } = await Query({
          page: ++this.page,
          serviceid: this.pageServiceId,
          datacontent,
          event: '0'
        });
        if (code == 0) {
          if (returnData.length === 0) {
            this.page--;
            this.noMore = true;
          }
          this.tableData.push(...returnData);
        } else {
          this.page--;
          this.$message.error("获取表格数据失败");
        }
      } catch (error) {
        this.page--;
      }
      this.noMore = true;
      this.loading = false;
    }
  }
}
</script>

<style lang="scss" scoped>
.TablePage {
  height: calc(100vh - 80px);
  padding: 20px;
  &_content {
    margin-top: 20px;
    height: calc(100vh - 180px);
    &_left {
      width: 360px;
      margin-right: 20px;
    }
    &_right {
    }
    .tableAuto {
      width: 100%;
    }
    .tableSacle {
      width: calc(100% - 380px);
    }
  }
}
</style>