/*******************************************************************************
 * Copyright(c) 2024 dongke All rights reserved. / Confidential
 * 类的信息：
 *		1.程序名称：
 *		2.功能描述：一览界面混入
 * 编辑履历：
 *		作者				日期					版本				修改内容
 *		周兴		  	2024-1-19       			1.00		       	新建
 *******************************************************************************/
const api = require('../utils/api.js');
const config = require('@/config/config.js');
const Constants = require('../utils/Constants.js')
import Dialog from '@/dist/dialog/dialog.js';
const app = getApp()

module.exports = {
  data: {
    imageUrl: config.image_url + '/static/img/',
    // 加载中
    loading: false,
    // 没有更多
    noMore: false,
    // 路由名称
    routeObjName: null,
    // 当前服务
    service: null,
    // 当前路由
    route: null,
    // 主键Id
    primaryKey: null,
    //菜单编码
    functionCode: null,
    // 是否分页
    pageFlag: true,
    // 分页
    pageInfo: {
      pageSize: Constants.PAGE_SIZE,
      currentPage: 1
    },
    // 查询条件
    searchContent: [],
    // 查询条件实体
    searchForm: null,
    // 大查询文本
    searchText: null,
    // 保存参数
    params: null,
    // 查询结果集
    tableData: [],
    // 需要校验表单Id名
    formName: 'dkForm',
    // 表单实体
    formData: null,
    // 表单类型
    formMode: null,
    // id
    id: null,
    // other
    other: null,
    // 当前数据
    item: null,
    // 新建后刷新一览界面标识
    refreshByAdd: false,
    // 表名
    table: null,
    // 界面的功能编码
    menuUuid: null,
    // 语言包
    $t: app.globalData.lang,
    // 是否进行校验
    validFlag: true,
  },
  /**
   * @desc : 获取路由信息，供data中的对象使用
   * @author : 周兴
   * @date : 2024/1/19
   */
  $routeUrl(routeObjName, key) {
    return app.globalData['routeUrl'][routeObjName][key]?.url
  },
  /**
   * @desc : 获取语言的方法
   * @author : 周兴
   * @date : 2024/1/19
   */
  $t(name) {
    if (this.data.$t[name]) {
      return this.data.$t[name];
    } else {
      return name;
    }
  },
  /**
   * @desc : 查询共通方法
   * @author : 周兴
   * @date : 2024/1/19
   */
  searchData(e) {
    // 加载中
    this.setData({
      loading: true
    })
    // 如果重新查询，需要nomore标识重置为false //并且分页重置
    if (e != 'more' && this.data.noMore) {
      this.setData({
        noMore: false,
        pageInfo: {
          pageSize: Constants.PAGE_SIZE,
          currentPage: 1
        },
      })
    }
    // 给参数赋值
    let params = this._setSearchParams();
    this._getData(params).then(res => {
      this.setData({
        loading: false
      })
      if (res == null) {
        return;
      }

      if (res && res.data.code === Constants.SUCESS_CODE) {
        let tableData = this.data.tableData;
        let list = []
        if (res.data.data && Array.isArray(res.data.data)) {
          list = res.data.data;
        } else {
          list = res.data.data.list
        }
        // 如果不是翻页，需要清空
        if (e != 'more') {
          let pageInfo = this.data.pageInfo
          pageInfo.currentPage = 1
          tableData = []
          this.setData({
            tableData: tableData,
            pageInfo
          })
        }
        // if (!list || list.length === 0) {
        //   this.setData({
        //     noMore: true
        //   })
        // }
        // console.log('ttt', list.length);
        if (e == 'more') {
          // 如果返回数据小于页数，就不能再继续翻页了
          if (list.length == 0 || list.length < this.data.pageInfo.pageSize) {
            this.setData({
              noMore: true
            })
          }
        }

        // else {
        //   this.setData({
        //     noMore: true
        //   })
        // }
        // 把查询数据加入到结果集中
        tableData = tableData.concat(list)
        this.setData({
          tableData: tableData
        })
        console.log('table', this.data.tableData, tableData, this.data.noMore);
        // 如果页面需要后续处理，再进行处理
        if (this.handleSearchData) {
          this.handleSearchData(tableData);
        }
      }
    });
  },
  /**
   * @desc : 给查询实体赋值
   * @author : 周兴
   * @date : 2024/1/19
   */
  _setSearchParams() {
    let params = {}
    if (this.data.searchForm) {
      params = JSON.parse(this.data.searchForm);
    }
    // 如果需要分页
    if (this.data.pageFlag) {
      console.log("zhehsisha", this.data.pageInfo, params, this.data.searchForm);
      params.pageSize = this.data.pageInfo.pageSize;
      params.currentPage = this.data.pageInfo.currentPage;
    }

    if (this.setSearchParams) {
      // 调用参数赋值
      params = this.setSearchParams(params);
    }
    return params;
  },
  /**
   * @desc : 执行查询共通方法
   * @author : 周兴
   * @date : 2024/1/19
   */
  _getData(params) {
    return new Promise(resolve => {
      if (this.getData) {
        let res = this.getData(params);
        resolve(res);
      } else {
        this.setData({
          loading: false
        })
        return (null)
      }
    })
  },
  /**
   * @desc : 跳转明细
   * @author : 周兴
   * @date : 2024/1/22
   */
  toDetail(e) {
    if (e) {
      let item = null;
      if (e.currentTarget.dataset.item) {
        item = e.currentTarget.dataset.item
      }
      if (!e.detail) {
        e.detail = {}
      }
      if (item) {
        e.detail.item = item;
      }
      console.log('e', e);
      if (e.detail.item) {
        let button = {
          formMode: Constants.formMode.edit
        }
        e.detail.item.button = button
      }
      // 如果name不传递，默认为edit
      e.detail.name = 'edit'
    }
    this.open(e);
  },
  /**
   * @desc : 点击按钮
   * @author : 周兴
   * @date : 2024/1/22
   */
  open(e) {
    // 如果没有路由就不往下进行
    if (!this.data.routeObjName) return;
    let name;
    let item;
    if (typeof e === 'object') {
      name = e.currentTarget.dataset.name;
      item = e.currentTarget.dataset.item;
      // 那可能是在detail中
      if (!name && e.detail) {
        name = e.detail.name;
        item = e.detail.item;
      }
      if (item && this.data.primaryKey) {
        item.id = item[this.data.primaryKey]
      }
    } else {
      name = e;
    }
    // 默认是新建
    if (!name) {
      name = 'add'
    }
    let routeUrl = this.data.route[name];
    if (!routeUrl) return;
    this._openValidData(item, name, routeUrl.valid).then(res => {
      if (!res) {
        return;
      }
      // 如果有链接，就跳转
      console.log('url', routeUrl);
      if (routeUrl.url) {
        let url = routeUrl.url
        //保存按钮自定义跳转URL
        if (e.detail.customUrl) {
          url = e.detail.customUrl
        }

        let _this = this;
        wx.navigateTo({
          url: url,
          events: {
            // 保存成功后刷新页面
            refresh: function (data) {
              // 刷新一览界面
              _this.searchData();
            }
          },
          success: function (res) {
            let data = {}
            console.log('success', item)
            if (item && item.button && item.button.idKey) {
              data['id'] = item[item.button.idKey]
            }
            if (item && item.id) {
              data['id'] = item.id
            }
            if (item && item.button && item.button.formMode) {
              data['formMode'] = item.button.formMode
            }
            console.log('routeUrl111111', routeUrl)

            //api 上的优先
            if (_this.data.route[name].formMode) {
              data['formMode'] = _this.data.route[name].formMode
            }
            if (_this.data.route[name].idKey) {
              data['id'] = item[_this.data.route[name].idKey]
            }

            if (item && item.button && item.button.formType) {
              data['formType'] = item.button.formType
            }
            if (routeUrl.formType) {
              data['formType'] = routeUrl.formType
            }
            // 新建增加默认的新建formMode
            if (name === 'add') {
              data['formMode'] = Constants.formMode.add;
            }
            data['item'] = item
            res.eventChannel.emit('params', data);
          }
        })
      } else {
        // 如果是方法就执行方法
        if (routeUrl.method) {
          this[routeUrl.method](item);
        }
      }
    })
  },
  /**
   * @desc : 执行保存方法
   * @author : 周兴
   * @date : 2024/1/22
   */
  save({
    saveFlag = true,
    url,
    dialogMes
  }) {
    // 校验
    this._validData().then(res => {
      if (!res) {
        return;
      }
      this.setData({
        loading: true
      })
      // 设置参数
      this._setParams();
      // 如果需要有询问
      if (dialogMes) {
        Dialog.confirm({
          message: dialogMes,
        }).then(() => {
          // 执行保存方法
          if (saveFlag) {
            this._handleSaveData();
          } else {
            wx.navigateTo({
              url: url,
            })
          }
        })
      } else {
        // 执行保存方法
        if (saveFlag) {
          this._handleSaveData();
        } else {
          wx.navigateTo({
            url: url,
          })
        }
      }
    });
  },
  /**
   * @desc : 保存方法
   * @author : 周兴
   * @date : 2024/1/22
   */
  _handleSaveData() {
    this._saveData(this.data.params).then(result => {
      this.setData({
        loading: false
      })
      console.log(result);
      if (result && result.data && result.data.code === Constants.SUCESS_CODE) {
        wx.showToast({
          title: '保存成功',
          image: '/static/image/success.png',
          duration: 2000
        })
        // 如果页面需要后续处理，再进行处理
        if (this.handleData) {
          this.handleData();
        }
        //是否返回上一页
        if (!this.data.navigateBackFlag) {
          // 非新建页面回到上一个页面
          if (this.data.formMode != Constants.formMode.add) {
            // 给父页面传递数据
            const eventChannel = this.getOpenerEventChannel();
            eventChannel.emit('refresh', {
              id: 1
            })
            wx.navigateBack({
              data: 1
            })
          } else {
            // 新建界面清空
            this.setData({
              formData: null
            })
            var pages = getCurrentPages();
            var prevPage = pages[pages.length - 2]; //上一个页面
            prevPage.setData({
              refreshByAdd: true
            })
          }
        } else {
          //不返回上一页 并且执行查询接口
          // 执行查询方法
          this.searchData()
        }

      }
    });
  },
  /**
   * @desc : 给实体赋值
   * @author : 周兴
   * @date : 2024/1/19
   */
  _setParams() {
    let params = {}
    console.log("_setParams", this.data.formData);
    if (this.data.formData && JSON.stringify(this.data.formData) !== '{}') {
      params = JSON.parse(this.data.formData);
    }
    this.setData({
      params: params
    })
    console.log('tttt', params, this.data.formData);
    if (this.setParams) {
      // 调用参数赋值
      let parm = this.setParams(params);
      this.setData({
        params: parm
      })
    }
  },
  /**
   * @desc   : 打开工具校验，（不给外部调用）
   * @author : 周兴
   * @date   : 2024/1/22 14:13
   */
  _openValidData(item, name, valid) {
    return new Promise(resolve => {
      // 页面校验
      if (this.openValidData && valid) {
        let flag = this.openValidData(item, name);
        resolve(flag);
      } else {
        resolve(true);
      }
    })
  },
  /**
   * @desc   : 校验，（不给外部调用）
   * @author : 周兴
   * @date   : 2024/1/22 14:13
   */
  _validData() {
    return new Promise(resolve => {
      // 不需要校验直接返回
      if (!this.data.validFlag) {
        resolve(true);
      }
      // 非空校验
      if (this.data.formName) {
        const component = this.selectComponent('#' + this.data.formName);
        console.log('tt', component);
        if (component && component.validData) {
          let valid = component.validData();
          if (!valid) {
            resolve(false);
          }
        }
      }
      // 页面校验
      if (this.validData) {
        let flag = this.validData();
        resolve(flag);
      } else {
        resolve(true);
      }
    })
  },
  /**
   * @desc   : 给参数赋值（不给外部调用）
   * @author : 周兴
   * @date   : 2024/1/22 14:33
   */
  _saveData(params) {
    return new Promise(resolve => {
      let res = this.saveData(params);
      resolve(res);
    })
  },
  /**
   * @desc   : 查询明细的方法（不给外部调用）
   * @author : 周兴
   * @date   : 2022/12/8 17:56
   */
  _detail(id) {
    this.loading = true;
    this.detail(id)?.then(res => {
      if (res.data.code === Constants.SUCESS_CODE && res.data.data) {
        // 给变量赋值
        if (this.setValuesByEdit) {
          this.setValuesByEdit(res.data.data)
        }
      }
      setTimeout(() => {
        this.loading = false
      }, 300)
    })
  },
  /**
   * @desc : 根据id查询数据
   * @date : 2024/2/26 15:49
   * @author : 周兴
   */
  detail(id) {
    return this.excute(this.data.service, id, null);
  },

  /**
   * @desc   : 查询明细的方法（不给外部调用）
   * @author : 周兴
   * @date   : 2022/12/8 17:56
   */
  _other(param) {
    this.loading = true;
    // 给参数赋值 
    this._getData(param).then(res => {
      if (res && res.data.code === Constants.SUCESS_CODE) {
        console.log("_other", res);
        // 给变量赋值
        if (this.setValuesByEdit) {
          this.setValuesByEdit(res.data.data)
        }
      }
      setTimeout(() => {
        this.loading = false
      }, 300)
    });

  },
  /**
   * @desc : 执行方法
   * @author : 周兴
   * @date : 2024/1/22
   */
  excute(service, method, params, showMessage = true, button = '') {
    if (service && method) {
      let url = service.prefix + method;
      let param = params;
      if (params && typeof params != 'object') {
        url = url + '/' + params;
        param = null;
      }
      let res = api.request(url, 'POST', param);
      if (res) {
        res.then(t => {
          if (showMessage) {
            if (t.code === Constants.SUCESS_CODE) {
              if (button == '') {
                button = Constants.Messages.save_sucess;
              }
              wx.showToast({
                title: button,
                image: '/static/image/success.png',
                duration: 2000
              })
              // if (searchFlag) {
              //   this.searchData();
              // }
            } else {
              if (t.message) {
                wx.showToast({
                  title: t.message,
                  image: '/static/image/warning.png',
                  duration: 2000
                })
              }
            }
          }
        })
      }
      return res;
    }
  },
  /**
   * @desc : 处理数据的有效标识（启用/停用）
   * @author : 周兴
   * @date : 2024/1/22
   */
  handleDataIsValid(e) {
    let item = e.detail.item;
    let primaryKey = this.data.primaryKey;
    let service = this.data.service;
    if (item && primaryKey && item[primaryKey] && service) {
      let method = item.flgValid ? service.disable : service.enable;
      return this.excute(service, method, item[primaryKey]).then(res => {
        if (res.data.code == Constants.SUCESS_CODE) {
          wx.showToast({
            title: '操作成功',
            image: '/static/image/success.png',
            duration: 2000
          })
          // 重新查询
          this.searchData()
        }
      });
    }
  },
  /**
   * @desc : 处理数据的有效标识（启用/停用）（用于像基础资料和商品属性）
   * @author : 周兴
   * @date : 2024/1/22
   */
  handleMoreDataIsValid(service, item, primaryKey) {
    if (service && item && item[primaryKey]) {
      let method = item.flgValid ? service.disable : service.enable;
      return this.excute(service, method, item[primaryKey]).then(res => {
        if (res.data.code == Constants.SUCESS_CODE) {
          wx.showToast({
            title: '操作成功',
            image: '/static/image/success.png',
            duration: 2000
          })
          this.setData({
            pageInfo: {
              currentPage: 1,
              pageSize: 5
            }
          })
          // 重新查询
          this.searchData()
        }
      });
    }
  },
  /**
   * @desc : 生命周期函数（onLoad)
   * @author : 周兴
   * @date : 2024/1/22
   */
  handleLoadData() {
    let formMode = this.data.formMode;
    console.log("handleLoadData", formMode);
    formMode = formMode ? formMode : Constants.formMode.index
    // 列表
    if (formMode == Constants.formMode.index) {
      // 默认查询
      this.searchData();
      // 更新用户功能频率
      this.saveUserMenuFrequency();
      // 编辑
    } else if (formMode == Constants.formMode.edit) {
      let id = this.data.id;
      console.log("handleLoadData-id", this.data);
      if (id) {
        // 调用明细
        this._detail(id);
      }
    } else if (formMode == Constants.formMode.other) {
      let other = this.data.other ? this.data.other : {};
      other.id = this.data.id
      if (other) {
        // 调用
        this._other(other);
      }
    } else if (formMode == Constants.formMode.add) {
      // 加载暂存数据
      this.loadTempData();
    }
  },
  /**
   * @desc : 加载暂存数据
   * @author : 周兴
   * @date : 2024/1/22
   */
  loadTempData() {
    var pages = getCurrentPages();
    var currentPage = pages[pages.length - 1];
    if (app.globalData[currentPage.route]) {

      Dialog.confirm({
        message: '是否加载缓存数据',
      }).then(() => {
        // 执行保存方法
        this.setData({
          formData: app.globalData[currentPage.route]
        })
        // 删除缓存
        delete app.globalData[currentPage.route]
      }).catch(() => {
        // 删除缓存
        delete app.globalData[currentPage.route]
      })
    }
  },
  /**
   * @desc : 保存用户功能频率
   * @author : 周兴
   * @date : 2024/1/22
   */
  saveUserMenuFrequency() {
    let menuUuid = this.data.menuUuid
    if (menuUuid) {
      let params = {
        menuUuid: menuUuid,
        staffId: app.globalData.user.staffId,
        appCode: Constants.APP_CODE,
      }
      let service = app.globalData['userMenuFrequencyService']
      // 保存用户功能频率
      this.excute(service, service.save, params);
      service = app.globalData['menuFrequencyService']
      // 保存功能频率
      params.cpId = app.globalData.company.cpId
      this.excute(service, service.save, params);
    }
  },
  /**
   * @desc : 生命周期函数（onShow)
   * @author : 周兴
   * @date : 2024/1/22
   */
  onShow() {
    // 新建后关闭新建后刷新页面
    if (this.data.refreshByAdd) {
      this.searchData();
      this.setData({
        refreshByAdd: false
      })
    }
  },
  /**
   * @desc : 生命周期函数（onLoad)
   * @author : 周兴
   * @date : 2024/1/22
   */
  onLoad() {
    let routeObjName = this.data.routeObjName;
    if (routeObjName) {
      // 根据routeObjName获取当前服务
      if (app.globalData[routeObjName + 'Service']) {
        this.setData({
          service: app.globalData[routeObjName + 'Service']
        })
      }
      // 根据routeObjName获取当前路由
      if (app.globalData['routeUrl'][this.data.routeObjName]) {
        this.setData({
          route: app.globalData['routeUrl'][routeObjName]
        })
      }
    }

    // 接收父页面传递的参数
    const eventChannel = this.getOpenerEventChannel();
    if (eventChannel && JSON.stringify(eventChannel) !== '{}') {
      let _this = this;
      // 指定类型
      eventChannel.once('params', function (data) {
        console.log('data', data);
        // 获取参数
        if (data.formMode) {
          _this.setData({
            id: data.id,
            other: data.item ? (data.item.button ? data.item.button.other : null) : "",
            formMode: data.formMode,
            menuUuid: data.menuUuid,
          })
        }
        //菜单编码
        if (data.functionCode) {
          _this.setData({
            functionCode: data.functionCode
          })
        }
        //选品弹出pop
        if (data.popContent) {
          _this.setData({
            popContent: data.popContent
          })
        }
        //控制标识 的 集合
        if (data.controlFlags) {
          _this.setData({
            controlFlags: data.controlFlags
          })
        }

        if (data.item) {
          _this.setData({
            item: data.item
          })
        }
        if (data.formItem) {
          console.log(data.formItem)
          _this.setData({
            formItem: data.formItem
          })
        }
        if (data.formType) { //表单保存修改按钮控制属性(标识)
          _this.setData({
            formType: data.formType
          })
        }
        if (data.chooseType) {
          _this.setData({
            chooseData: data
          })
        }
        console.log('ddd', data);
        if (data.route) {
          _this.setData({
            chooseRoute: data.route
          })
        }
        // 加载后续数据
        _this.handleLoadData();
        // 页面设置初始信息
        if (_this.loadInit) {
          _this.loadInit();
        }
      })
    } else {
      // 加载后续数据
      this.handleLoadData();
      // 页面设置初始信息
      if (this.loadInit) {
        this.loadInit();
      }
    }
  },
  /**
   * @desc : 生命周期函数（onUnload)
   * @author : 周兴
   * @date : 2024/1/22
   */
  onUnload() {
    // 关闭时，如果数据源有值，记录到缓存中
    let formData = this.data.formData
    // 获取当前页面的路由
    var pages = getCurrentPages();
    var currentPage = pages[pages.length - 1];
    let route = currentPage.route;
    if (formData && formData != '{}') {
      // 记录缓存
      app.globalData[route] = formData;
    } else {
      // 删除对应的缓存
      delete app.globalData[route]
    }
  },
  /**
   * @desc : 页面上拉触底事件的处理函数
   * @author : 于继渤
   * @date : 2022/5/24 12:16
   */
  onReachBottom: function () {
    // 不分页也不能进行下翻
    if (!this.data.pageFlag || this.data.loading || this.data.noMore) {
      return;
    }
    this.setData({
      pageInfo: {
        pageSize: this.data.pageInfo.pageSize,
        currentPage: this.data.pageInfo.currentPage + 1
      }
    })
    // 执行查询方法
    this.searchData('more')
  },

  /**
   * @desc : 页面下拉刷新事件的处理函数
   * @author : 于继渤
   * @date : 2024/4/10 12:16
   */
  onPullDownRefresh(e) {
    this.setData({
      noMore: true
    })
    setTimeout(() => {
      // 执行查询方法
      this.searchData()
      //停止刷新
      wx.stopPullDownRefresh()
    }, 300)
  },
};