// 第三方依赖
import * as React from 'react';
import isFunction from 'lodash/isFunction';
import isPlainObject from 'lodash/isPlainObject';
// 相对依赖
import { CnFormat } from '../../../../../../../cn-ai-table/view/components/format';
import { getCellFormat } from './cache-format';
/**
 * 创建 CnFormat 单元格渲染器
 * @param format 格式类型
 * @param column 列定义
 * @returns cell 渲染函数
 */
function createCnFormatCell(format, column) {
    // 提取列配置中的静态属性（这些属性不会因数据变化而变化）
    // @ts-ignore -- 兼容旧版 dateInterv 配置
    const { dateInterv } = column;
    // @ts-ignore -- 兼容旧版 dateFormat 配置
    const { dateFormat } = column;
    const originalCell = column.cell;
    // 创建新的渲染函数，确保始终使用传入的最新 value 和 record
    const CnFormatCell = (value, index, record) => {
        // 如果 column 已有 cell 方法，使用它但传入最新数据
        if (isFunction(originalCell)) {
            return originalCell(value, index, record);
        }
        return (React.createElement(CnFormat, { format: format, value: value, others: {
                // format="date" 兼容参数（逐步废弃）
                dateInterv,
                dateFormat,
            } }));
    };
    return CnFormatCell;
}
/**
 * 解析格式配置
 * 统一处理函数和对象两种格式配置
 *
 * @param configFormatMatch 格式配置（可能是函数或对象）
 * @param column 列定义
 * @returns 解析后的格式配置对象
 */
function resolveFormatConfig(configFormatMatch, column) {
    if (typeof configFormatMatch === 'function') {
        return configFormatMatch(column);
    }
    if (isPlainObject(configFormatMatch)) {
        return configFormatMatch;
    }
    return null;
}
/**
 * 处理单个列的格式化
 * 纯函数，不修改输入对象
 *
 * @param item 列定义
 * @param formatMap 格式映射表
 * @param cnFormatList CnFormat 支持的格式列表
 * @returns 处理后的列定义
 */
function processColumn(item, formatMapObj, cnFormatList) {
    var _a;
    // 检查是否有自定义渲染函数
    const hasRender = isFunction(item.render);
    const hasCell = isFunction(item.cell);
    // 获取当前列的格式化方式
    const itemFormat = (_a = item === null || item === void 0 ? void 0 : item.format) !== null && _a !== void 0 ? _a : 'text';
    // 从格式映射表获取格式配置
    const configFormatMatch = formatMapObj[itemFormat];
    const formatConfig = resolveFormatConfig(configFormatMatch, item);
    // 如果有格式配置，合并到列定义中
    if (formatConfig) {
        // 使用类型断言，因为 FormatConfig 可能包含 width: string | number
        // 而 ICnTableColumn 要求 width: number
        return { ...item, ...formatConfig };
    }
    // 如果有自定义 render 函数，直接返回原对象
    if (hasRender) {
        return item;
    }
    // 如果有自定义 cell 函数，包装它以确保使用最新数据
    // 这样可以避免闭包捕获旧数据的问题
    if (hasCell) {
        return {
            ...item,
            cell: createCnFormatCell(itemFormat, item),
        };
    }
    // 检查 CnFormat 是否支持该格式
    if (cnFormatList.includes(itemFormat.toLowerCase())) {
        return {
            ...item,
            cell: createCnFormatCell(itemFormat, item),
        };
    }
    // 没有匹配的格式，返回原对象
    return item;
}
/**
 * 处理列数组的格式化
 * 为每列添加对应的 cell 渲染函数
 *
 * @param columns 列定义数组
 * @param format 自定义格式映射
 * @param context 本地化上下文
 * @returns 处理后的列定义数组
 */
export function cellFormat(columns, format, context) {
    // 如果传入的 columns 不是数组，直接返回
    if (!Array.isArray(columns)) {
        return columns;
    }
    // 缓存 CnFormat 支持的格式列表，避免在循环中重复调用
    const cnFormatList = CnFormat.getAllSupportFormat();
    // 遍历 columns 数组，对每个元素进行处理
    return columns.map((item) => {
        // 创建浅拷贝，避免修改原对象
        let processedItem = { ...item };
        // 处理表头嵌套的情况
        if (Array.isArray(processedItem.children)) {
            processedItem = {
                ...processedItem,
                children: cellFormat(processedItem.children, format, context),
            };
        }
        // 获取当前列的本地化适配标识
        const adapterLocale = processedItem === null || processedItem === void 0 ? void 0 : processedItem.adapterLocale;
        // 获取格式化函数映射表
        const formatMapObj = getCellFormat(format, context, adapterLocale);
        // 处理列的格式化
        return processColumn(processedItem, formatMapObj, cnFormatList);
    });
}
