// 换算
import store from '@/store'

export default class Convert {
  defaultConfig = { // 转换配置
    money: [], /** 金额 @param {Array<String|Number>}  */
    duration: [], /** 时长 @param {Array<String|Number>}  */
    array: [], /** 数组 @param {Array<String|Number>}  */
    dict: {} /** 字典 @param {Object<{[prop]:[code]}>} @example dict: { inout: 112 } */
  }
  formatSuffix = 'Str' // dict等类型，转换后加后缀，避免影响原数据使用（如inout则增加inoutStr字段）
  constructor(config) {
    Object.assign(this.defaultConfig, config)
    this.init()
  }
  list = (list, isReceive, config = this.defaultConfig) => { // 列表数据转换（列表）
    return list.map(item => {
      this.obj(item, isReceive, config)
      return item
    })
  }
  obj = (obj, isReceive, config = this.defaultConfig) => { // 单个数据转换（新增、修改、详情）
    config.money?.forEach(key => { // 分 元
      if (isReceive) obj[key] ? obj[key] = toPrecision(obj[key] / 100, 2) : null
      else obj[key] ? obj[key] = toPrecision(obj[key] * 100) : null
    })
    config.duration?.forEach(key => { // 分钟 小时
      if (isReceive) obj[key] ? obj[key] = toPrecision(obj[key] / 60, 1) : null
      else obj[key] ? obj[key] = toPrecision(obj[key] * 60, 1) : null
    })
    this.formatSuffix && Object.entries(config.dict).forEach(([key, code]) => { // 字典（需要先 init ）
      if (isReceive) obj[key + this.formatSuffix] = findValue(code, obj[key])
      // else obj[key] = findValue(code, obj[key]) // 提交用dictSelect组件即可
    })
    config.array?.forEach(key => { // 数组 逗号分隔
      if (isReceive) obj[key] ? obj[key] = obj[key].split(',').map(v => parseFloat(v || 0)) : null
      else obj[key] ? obj[key] = obj[key].join(',') : null
    })
    return obj
  }
  init = () => {
    Object.values(this.defaultConfig.dict).forEach((code) => {
      store.dispatch('dict/dict', code)
    })
  }
}

/* 其它辅助函数 */
const public_dict = store.getters.public_dict
const findValue = (code, val, spe = false, key = 'mycode') => { // 获取数字字典key值 增加单独处理 spe
  if (!val && val != 0) return '--'
  const obj = public_dict?.[code] ? public_dict[code].find(item => spe ? item[key].indexOf(val) > -1 : item[key] == val) : {}
  return obj?.myname || '--'
}
export function toPrecision(num, precision) { // 根据精度保留数字
  if (precision === undefined) precision = 0
  return parseFloat(
    Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision)
  )
}
