import { useMemo } from 'react';
import { FIELD_TYPE_ICONS } from '../constants/field-type-icons';
import { useBrandAssets } from '../../../theme/context.js';
/**
 * TODO: 待优化，应修改为统一通过schema来获取组件类型
 * format 类型到组件类型的映射
 * 用于从列定义的 format 属性推断对应的组件类型（主要用于系统字段）
 */
const FORMAT_TO_COMPONENT_MAP = {
    user: 'CnEmployeeSelect',
    date: 'CnDatePickerPro',
    'date-time': 'CnDatePickerPro',
    lookup: 'CnLookupField',
    formula: 'CnFormulaField',
};
/**
 * 从 format 属性获取组件类型
 * @param format 列的 format 属性（如 'user', 'date' 等）
 * @returns 组件类型，如果无法映射则返回 undefined
 */
const getComponentTypeFromFormat = (format) => {
    if (!format)
        return undefined;
    return FORMAT_TO_COMPONENT_MAP[format];
};
/**
 * 统一获取字段的组件类型
 * 优先从 fieldMap中获取，如果不存在则从 format 属性获取
 * @param fieldMap 字段映射配置
 * @param columnId 列ID
 * @param format 列的 format 属性（兜底方案，用于系统字段）
 * @returns 组件类型
 */
export const getFieldComponentType = (fieldMap, columnId, format) => {
    if (fieldMap && columnId) {
        const field = fieldMap[columnId];
        if (field === null || field === void 0 ? void 0 : field['x-component']) {
            return field['x-component'];
        }
    }
    return getComponentTypeFromFormat(format);
};
/**
 * 获取字段图标（纯函数版本，需要手动传 overrides）
 */
export const getFieldIcon = (fieldType, overrides) => {
    if (!fieldType)
        return (overrides === null || overrides === void 0 ? void 0 : overrides.default) || FIELD_TYPE_ICONS.default;
    return ((overrides === null || overrides === void 0 ? void 0 : overrides[fieldType]) ||
        FIELD_TYPE_ICONS[fieldType] ||
        (overrides === null || overrides === void 0 ? void 0 : overrides.default) ||
        FIELD_TYPE_ICONS.default);
};
/**
 * Hook: 返回自动集成 ConfigProvider 覆盖的 getIcon 函数。
 * 组件内部使用此 hook，无需手动传递 overrides。
 *
 * @example
 * ```tsx
 * const getIcon = useFieldIcon();
 * <img src={getIcon('CnInput')} />
 * ```
 */
export function useFieldIcon() {
    const assets = useBrandAssets();
    const overrides = assets.table.fieldTypeIcons;
    return useMemo(() => (fieldType) => getFieldIcon(fieldType, overrides), [overrides]);
}
