import { getCustomFormulas } from './sd-formula-exps.vue'
let xmformulas
getCustomFormulas().then((data) => {
  xmformulas = data
})
const f = function(o) {
  const xmformula = xmformulas?.find((i) => i.data === o.actual?.data)
  if (xmformula?.toExpression) {
    // 公式字段名默认带上了{}这里去掉{|}
    const params = o.actual?.params.map((item) => item.actual.data.replace(/{|}/g, ''))
    Object.assign(o, xmformula.toExpression.bind(o)(...params))
  }
  if (o.actual?.data === 'AND' || o.actual?.data === 'OR') {
    o.dataType = 'exps'
    o.op = o.actual.data.toLocaleLowerCase()
    o.expressionsValue = o.actual?.params.filter((i) => i.actual).map((i) => f(i))
  }
  if (o.actual?.data === 'UNLIKE') {
    o.dataType = 'exp'
    o.op = 'not'
    o.expressionValue = {
      dataType: 'str',
      op: 'like',
      name: o.actual?.params[0].actual.data.replace(/{|}/g, ''),
      stringValue: '%' + o.actual?.params[1].actual.data + '%',
    }
  }
  if (o.actual?.data === 'NOTEXACT') {
    // 字符不相等
    o.dataType = 'str'
    o.op = 'ne'
    o.name = o.actual?.params[0].actual.data.replace(/{|}/g, '')
    o.stringValue = o.actual?.params[1].actual.data
  }
  if (o.actual?.data === 'EXACT') {
    // 字符相等
    o.dataType = 'str'
    o.op = 'eq'
    o.name = o.actual?.params[0].actual.data.replace(/{|}/g, '')
    o.stringValue = o.actual?.params[1].actual.data
  }
  if (o.actual?.data === 'USEREXACT' || o.actual?.data === 'DEPEXACT') {
    // 部门相等
    o.dataType = 'str'
    o.op = 'eq'
    o.name = o.actual?.params[0].actual.data.replace(/{|}/g, '')
    if (o.actual?.params[1].actual.data === '{%CURRENTUSER%}') {
      o.placeholderValue = '@@{currentUser}@@'
    } else {
      o.stringValue = JSON.parse(o.actual?.params[1].actual.data || '[]')
        .map((i) => i.code)
        .join(',')
    }
  }
  if (o.actual?.data === 'IN') {
    // 字符串IN
    o.dataType = 'str'
    o.op = 'in'
    o.name = o.actual?.params[0].actual.data.replace(/{|}/g, '')
    o.stringValues = JSON.parse(o.actual?.params[1]?.actual.data || '[]')
  }
  if (o.actual?.data === 'LIKE') {
    // 模糊匹配
    o.dataType = 'str'
    o.op = 'like'
    o.name = o.actual?.params[0].actual.data.replace(/{|}/g, '')
    o.stringValue = '%' + o.actual?.params[1].actual.data + '%'
  }
  if (['DATELT', 'DATEGT'].includes(o.actual?.data)) {
    if (o.actual?.data === 'DATELT') o.op = 'lt'
    if (o.actual?.data === 'DATEGT') o.op = 'gt'
    o.dataType = 'long'
    o.name = o.actual?.params[0].actual.data.replace(/{|}/g, '')
    if (o.actual?.params[1].actual.data === '{%currentTime%}') {
      o.placeholderValue = '@@{currentTime}@@'
    } else {
      o.longValue = parseFloat(o.actual?.params[1].actual.data)
    }
  }
  if (['NUMEXACT', 'NOTNUMEXACT', 'LT', 'GT', 'LE', 'GE'].includes(o.actual?.data)) {
    if (o.actual?.data === 'NUMEXACT') o.op = 'eq'
    if (o.actual?.data === 'NOTNUMEXACT') o.op = 'ne'
    if (o.actual?.data === 'LT') o.op = 'lt'
    if (o.actual?.data === 'GT') o.op = 'gt'
    if (o.actual?.data === 'LE') o.op = 'le'
    if (o.actual?.data === 'GE') o.op = 'ge'
    o.dataType = 'double'
    o.name = o.actual?.params[0].actual.data.replace(/{|}/g, '')
    o.doubleValue = parseFloat(o.actual?.params[1].actual.data)
  }
  delete o.actual
  delete o.label
  delete o.data
  delete o.spread
  return o
}

const formula2exps = (formulaObject) => {
  if (!formulaObject || !formulaObject.params.length) {
    return []
  }
  return [f(JSON.parse(JSON.stringify(formulaObject)).params[0])]
}
export default formula2exps
