// src/utils/selectOptionUtils.ts
import type { JSONObject } from '@antv/x6'

/**
 * 获取下拉选项的key值
 */
export const getOptionKey = (item: JSONObject, index: number, valueKey: string = 'dataValue'): string => {
  const value = item[valueKey] ?? item.value ?? item.id
  if (value !== undefined && value !== null) {
    return String(value)
  }
  return `option_${index}`
}

/**
 * 获取下拉选项的显示文本
 */
export const getOptionLabel = (item: JSONObject, labelKey: string = 'dataLabel'): string => {
  const label = item[labelKey] ?? item.label ?? item.name ?? item.text ?? ''
  return String(label)
}

/**
 * 获取下拉选项的值
 */
export const getOptionValue = (item: JSONObject, valueKey: string = 'dataValue'): string => {
  const value = item[valueKey] ?? item.value ?? item.id ?? ''
  return String(value)
}

/**
 * 根据值查找显示文本（增强版）
 * @param value 要查找的值
 * @param options 选项数组
 * @param valueKeys 可能的值字段名，默认 ['value', 'dataValue', 'id']
 * @param labelKeys 可能的标签字段名，默认 ['label', 'dataLabel', 'name', 'text']
 * @returns 显示文本
 */
export const findOptionLabel = (
  value: string | number,
  options: JSONObject[],
  valueKeys: string[] = ['value', 'dataValue', 'id'],
  labelKeys: string[] = ['label', 'dataLabel', 'name', 'text']
): string => {
  if (!value || !options || !options.length) return String(value || '')

  const strValue = String(value).trim()
  if (!strValue) return ''

  // 查找匹配的项
  const item = options.find(opt => {
    // 尝试多个可能的字段名
    for (const key of valueKeys) {
      const optValue = opt[key]
      if (optValue !== undefined && optValue !== null && String(optValue).trim() === strValue) {
        return true
      }
    }
    return false
  })

  if (item) {
    // 尝试多个可能的标签字段名
    for (const key of labelKeys) {
      const label = item[key]
      if (label !== undefined && label !== null && String(label).trim() !== '') {
        return String(label).trim()
      }
    }
    // 如果没有找到label，返回原始值
    return strValue
  }

  return strValue
}

/**
 * 根据多个值查找多个显示文本（用于多选情况）
 */
export const findMultipleLabels = (
  values: (string | number)[],
  options: JSONObject[],
  valueKeys: string[] = ['value', 'dataValue', 'id'],
  labelKeys: string[] = ['label', 'dataLabel', 'name', 'text'],
  separator: string = ','
): string => {
  if (!values || !values.length || !options || !options.length) return ''

  const labels = values.map(value => findOptionLabel(value, options, valueKeys, labelKeys))
  return labels.filter(label => label).join(separator)
}
