/**
 * Display 层：地址类型组件 tag 显示工具
 *
 * 【主要功能】
 * 处理地址类型组件（如 CnAddress、AddressSelect）的 tag 显示
 * 当 value 是 code 值（字符串或数字）时，从 options 中查找对应的 label 进行显示
 *
 * 【使用场景】
 * - FieldTagPopup.tsx: 显示 tag 中的字段值
 * - getDisplayValueFromFormMap: 格式化显示值
 * - getDisplayLabelFromOptions: 格式化"已为您查询"和常用查询条件面板的显示值
 * - FieldTagPopupWrapper: 初始化 formMap 时格式化地址值
 */
/**
 * 判断是否为地址类型组件
 * @param columnType - 组件类型
 * @returns 是否为地址类型组件
 */
export function isAddressType(columnType) {
    return columnType === 'CnAddress' || columnType === 'AddressSelect';
}
/**
 * 从 options 中查找地址 label
 * @param code - 地址 code 值
 * @param options - 选项列表
 * @returns 找到的 label，如果未找到则返回 code
 */
function findAddressLabel(code, options) {
    if (!options || !Array.isArray(options) || options.length === 0) {
        return String(code);
    }
    // 查找匹配的 option
    const option = options.find((opt) => {
        // 如果 option.value 是对象，比较 value.code 或 value.value
        if (typeof opt.value === 'object' && opt.value !== null) {
            return (opt.value.code === code ||
                opt.value.value === code ||
                String(opt.value.code) === String(code) ||
                String(opt.value.value) === String(code));
        }
        // 如果 option.value 是原始值，直接比较
        return opt.value === code || String(opt.value) === String(code);
    });
    if (option === null || option === void 0 ? void 0 : option.label) {
        return option.label;
    }
    // 如果 option.value 是对象且有 label，使用它
    if ((option === null || option === void 0 ? void 0 : option.value) && typeof option.value === 'object' && option.value.label) {
        return option.value.label;
    }
    // 如果未找到，返回 code
    return String(code);
}
/**
 * 格式化地址值的显示文本
 * @param value - 地址值（可能是 code、对象或数组）
 * @param options - 选项列表
 * @returns 格式化后的显示文本
 */
export function formatAddressDisplayValue(value, options) {
    if (value == null || value === '') {
        return '';
    }
    // 处理数组值（多选）
    if (Array.isArray(value)) {
        if (value.length === 0) {
            return '';
        }
        // 如果数组元素是对象且有 label，直接使用
        if (value.length > 0 && typeof value[0] === 'object' && value[0] !== null) {
            const labels = value.map((v) => {
                if (v.label) {
                    return v.label;
                }
                // 如果有 value 字段，从 options 中查找
                if (v.value !== undefined) {
                    return findAddressLabel(v.value, options);
                }
                // 如果有 code 字段，从 options 中查找
                if (v.code !== undefined) {
                    return findAddressLabel(v.code, options);
                }
                return String(v);
            });
            return labels.filter(Boolean).join(', ');
        }
        // 如果数组元素是原始值（code），从 options 中查找 label
        const labels = value.map((code) => findAddressLabel(code, options));
        return labels.filter(Boolean).join(', ');
    }
    // 处理对象值
    if (typeof value === 'object' && value !== null) {
        // 如果对象有 label，直接使用
        if (value.label) {
            return value.label;
        }
        // 如果有 value 字段，从 options 中查找
        if (value.value !== undefined) {
            return findAddressLabel(value.value, options);
        }
        // 如果有 code 字段，从 options 中查找
        if (value.code !== undefined) {
            return findAddressLabel(value.code, options);
        }
        // 如果都没有，返回字符串表示
        return JSON.stringify(value);
    }
    // 处理原始值（code）
    return findAddressLabel(value, options);
}
/**
 * 提取地址的 code 值（用于存储到 formMap.values）
 * @param value - 地址值（可能是 code、对象或数组）
 * @returns 提取的 code 值
 */
export function extractAddressCode(value) {
    if (value == null || value === '') {
        return value;
    }
    // 处理数组值
    if (Array.isArray(value)) {
        return value.map((v) => {
            if (typeof v === 'object' && v !== null) {
                if (v.code !== undefined) {
                    return v.code;
                }
                if (v.value !== undefined) {
                    return v.value;
                }
                return v;
            }
            return v;
        });
    }
    // 处理对象值
    if (typeof value === 'object' && value !== null) {
        if (value.code !== undefined) {
            return value.code;
        }
        if (value.value !== undefined) {
            return value.value;
        }
        return value;
    }
    // 处理原始值
    return value;
}
