import { areaList } from '@vant/area-data'

// 定义树形结构的类型
interface AreaNode {
    text: string
    value: string
    children?: AreaNode[]
}

/**
 * 将areaList转换为树形结构（省市县三级联动）
 * @returns 树形结构的地区数据
 */
export const convertToTree = (): AreaNode[] => {
    const { province_list, city_list, county_list } = areaList
    const tree: AreaNode[] = []

    // 遍历所有省份
    Object.entries(province_list).forEach(([provinceCode, provinceName]) => {
        const provinceNode: AreaNode = {
            text: provinceName,
            value: provinceCode,
            children: [],
        }

        // 查找该省份下的所有城市
        Object.entries(city_list).forEach(([cityCode, cityName]) => {
            // 城市代码的前两位与省份代码的前两位相同表示属于该省份
            if (cityCode.substring(0, 2) === provinceCode.substring(0, 2)) {
                const cityNode: AreaNode = {
                    text: cityName,
                    value: cityCode,
                    children: [],
                }

                // 查找该城市下的所有区县
                Object.entries(county_list).forEach(([countyCode, countyName]) => {
                    // 区县代码的前四位与城市代码的前四位相同表示属于该城市
                    if (countyCode.substring(0, 4) === cityCode.substring(0, 4)) {
                        cityNode.children!.push({
                            text: countyName,
                            value: countyCode,
                        })
                    }
                })

                provinceNode.children!.push(cityNode)
            }
        })

        tree.push(provinceNode)
    })

    return tree
}

// 导出树形结构数据（懒加载）
let areaTreeCache: AreaNode[] | null = null
export const getAreaTree = (): AreaNode[] => {
    if (!areaTreeCache) {
        areaTreeCache = convertToTree()
    }
    return areaTreeCache
}

// 向后兼容的导出
export const areaTree = getAreaTree()

/**
 * 根据地区代码获取完整的地区名称（如：广东省广州市天河区）
 * @param code 地区代码
 * @returns 完整的地区名称
 */
export const getFullAreaName = (code: string): string => {
    const { province_list, city_list, county_list } = areaList
    let name = ''

    if (county_list[code]) {
        // 如果是区县代码，获取完整的省市县名称
        const cityCode = code.substring(0, 4) + '00'
        const provinceCode = code.substring(0, 2) + '0000'
        name = `${province_list[provinceCode]}${city_list[cityCode]}${county_list[code]}`
    } else if (city_list[code]) {
        // 如果是城市代码，获取完整的省市名称
        const provinceCode = code.substring(0, 2) + '0000'
        name = `${province_list[provinceCode]}${city_list[code]}`
    } else if (province_list[code]) {
        // 如果是省份代码，直接返回省份名称
        name = province_list[code]
    }

    return name
}

// 根据编号获取文本
export function getTextByCode(code) {
    // 直接查询，避免多层嵌套循环
    if (areaList.province_list[code]) {
        return areaList.province_list[code]
    }
    if (areaList.city_list[code]) {
        return areaList.city_list[code]
    }
    if (areaList.county_list[code]) {
        return areaList.county_list[code]
    }
    return null
}

// 根据文本获取编号
export function getCodeByText(text) {
    // 使用Object.entries和find方法优化性能
    const findCode = (obj: Record<string, string>) => {
        const entry = Object.entries(obj).find(([_, value]) => value === text)
        return entry ? entry[0] : null
    }
    
    return findCode(areaList.province_list) 
        || findCode(areaList.city_list) 
        || findCode(areaList.county_list)
}
