import { EnumValue, enumValueObj } from '@/api/dataset'

let filterEnumMap = {}

const filterIdNameEnumMap = {}

const findFilterEnum = async (val: EnumValue) => {
  const queryId = val.queryId
  const displayId = val.displayId
  const arr = await enumValueObj({ queryId: queryId, displayId: displayId, searchText: '' })
  return arr?.reduce((acc, item) => {
    acc[item[displayId]] = item[queryId]
    return acc
  }, {})
}

export const filterEnumParams = (queryParams, fieldId: string) => {
  const resultMap = filterEnumMap[fieldId]
  if (resultMap) {
    const resultParams = []
    queryParams.forEach(param => {
      resultParams.push(resultMap[param] || param)
    })
    return resultParams
  } else {
    return queryParams
  }
}

export const filterEnumParamsReduce = (queryParams, fieldId: string) => {
  const resultMap = filterEnumMap[fieldId]
  if (resultMap) {
    const resultMapReduce = Object.fromEntries(
      Object.entries(resultMap).map(([key, value]) => [value, key])
    )
    const resultParams = []
    queryParams.forEach(param => {
      resultParams.push(resultMapReduce[param] || param)
    })
    return resultParams
  } else {
    return queryParams
  }
}

export const filterEnumMapSync = async componentData => {
  filterEnumMap = {}
  for (const element of componentData) {
    if (element.component === 'VQuery') {
      for (const filterItem of element.propValue) {
        const { optionValueSource, field, displayId } = filterItem
        if (optionValueSource === 1 && field.id) {
          filterEnumMap[field.id] = await findFilterEnum({
            queryId: field.id,
            displayId,
            searchText: ''
          })
        }
      }
    }
  }
}

export function filterParamsOptions(params, paramsOption) {
  // 如果 params 为空,直接返回 null
  if (!params || (Array.isArray(params) && params.length === 0)) {
    return null
  }
  // 如果 paramsOption 为空,直接返回 null
  if (!paramsOption || paramsOption.length === 0) {
    return null
  }
  // 创建 paramsOption 集合和前缀集合用于快速查找
  const optionSet = new Set(paramsOption)
  const prefixSet = new Set()
  // 收集所有可能的父级前缀
  paramsOption.forEach(option => {
    if (option.includes('-de-')) {
      const parts = option.split('-de-')
      // 收集所有前缀:父级、祖父级等
      for (let i = 1; i < parts.length; i++) {
        const prefix = parts.slice(0, i).join('-de-')
        prefixSet.add(prefix)
      }
    }
  })

  // 检查一个值是否在 paramsOption 中存在(考虑层级关系)
  function checkValueExists(value) {
    // 直接存在
    if (optionSet.has(value)) {
      return true
    }
    // 如果是层级结构,检查所有父级前缀
    if (value.includes('-de-')) {
      const parts = value.split('-de-')

      // 检查所有可能的父级前缀
      for (let i = 1; i < parts.length; i++) {
        const prefix = parts.slice(0, i).join('-de-')
        if (optionSet.has(prefix)) {
          return true
        }
      }
    }

    // 检查该值是否是某个选项的父级
    // 如:paramsOption 中有 "香橙店-de-浓郁椰奶",传入 "香橙店" 也应该匹配
    if (
      Array.from(optionSet).some(option => option.startsWith(value + '-de-') || option === value)
    ) {
      return true
    }
    // 检查该值是否是某个选项的前缀(通过 prefixSet)
    if (prefixSet.has(value)) {
      return true
    }
    return false
  }
  // 处理单值情况(字符串)
  if (typeof params === 'string') {
    return checkValueExists(params) ? params : null
  }
  // 处理数组情况
  if (Array.isArray(params)) {
    // 过滤出存在的值
    const filtered = params.filter(value => typeof value === 'string' && checkValueExists(value))
    // 如果过滤后为空,返回 null,否则返回过滤后的数组
    return filtered.length > 0 ? filtered : null
  }
  // 其他类型返回 null
  return null
}