/*
 * ✨ 字典工具类函数 ✨
 * */

import { useDictStore } from '@/stores/dict'
const dictStore = useDictStore()
/**
 * 通过字典编码获取字典
 * @param {String} code 字典编码
 * @return {Array} 字典
 * @example
 * getDictionaryByCode('xxx') // 获取'xxx'字典编码对应的字典数组
 * */
export function getDictionaryByCode(code = '') {
    if (!(typeof code === 'string' && code)) return []
    return dictStore.getDictDataByCode(code)
}

/**
 * 通过字典编码及其关联的value或name值获取级联字典
 * @param {String} code 字典编码
 * @param {String | Number} event 关联的value或name值
 * @param {'value' | 'name'} [eventType = 'value'] 通过名称还是值获取级联字典
 * @return {Array} 级联字典
 * @example
 * getCascadeDictByCodeEvent(code,event)
 * */
export function getCascadeDictByCodeEvent(
    code: string,
    event: string | number,
    eventType = 'value'
) {
    const eventTypeArr = ['value', 'name'] // 限制eventType参数值
    if (!eventTypeArr.includes(eventType)) return []
    // 匹配级联字典对象
    const cascadeDictObj =
        getDictionaryByCode(code).find((item: any) => item[eventType] === event)?.lowerDic || {}
    // 将级联字典对象转为二维数组后，合并所有字典
    return Object.entries(cascadeDictObj).reduce((concatDictArr, [_, dictArr = []]) => {
        if (!(Array.isArray(dictArr) && dictArr.length)) return concatDictArr
        return concatDictArr.concat(dictArr)
    }, [])
}

/**
 * 配置对象
 * @typedef {Object} EscapeConfig
 * @property {String} [valueKey = 'value'] 需转义字段键名
 * @property {String} [labelKey = 'name'] 对应字段键名
 * @property {Boolean} [dictionaryType = true] true 为转义 false 为翻译
 * @property {Boolean} [congruent = true] 匹配为全等于还是等于
 * */

/**
 * 转义、翻译函数
 * @param {Array | string} data 配置数组或字典编码
 * @param {String} val 需转义内容
 * @param {EscapeConfig} [escapeConfig] 配置对象
 * @returns {String} 转义后的内容
 * */
export function dictionaryEscape(data, val = '', escapeConfig = {}) {
    // 参数归一化
    if (typeof data === 'string') data = getDictionaryByCode(data)
    if (!(Array.isArray(data) && data.length)) return ''

    escapeConfig = {
        valueKey: 'value',
        labelKey: 'name',
        dictionaryType: true,
        congruent: true,
        ...escapeConfig
    }
    const { valueKey, labelKey, dictionaryType, congruent } = escapeConfig
    const item =
        data.find((i) => {
            const dictionaryValue = i[dictionaryType ? valueKey : labelKey] // 字典值
            let condition = dictionaryValue === val // 返回条件
            if (!congruent) condition = dictionaryValue == val
            return condition
        }) || {}
    return item[dictionaryType ? labelKey : valueKey] || ''
}
