import * as React from 'react';
import { cellFormat as applyCellFormat } from '../view/components/views/table-view/cell-format/index';
import { flexRender } from '../../cn-ai-table/react-table';
/** 默认整份 options；避免 `useCellFormat(columns)` 时每次隐式传入新 `{}`。 */
const EMPTY_OPTS = {};
/** 未传 format/context 时共用同一空对象，保证引用稳定且满足 Record 类型。 */
const EMPTY_FORMAT_CONTEXT = {};
/**
 * 单元格格式化 Hook
 * 预处理列定义，自动为列添加 cell 渲染函数，避免每次渲染时重复计算
 *
 * @param columnDefinitions 列定义数组
 * @param options 配置选项
 * @returns renderCell / renderCellContent 渲染函数
 */
export function useCellFormat(columnDefinitions, options = EMPTY_OPTS) {
    var _a, _b;
    const format = (_a = options.format) !== null && _a !== void 0 ? _a : EMPTY_FORMAT_CONTEXT;
    const context = (_b = options.context) !== null && _b !== void 0 ? _b : EMPTY_FORMAT_CONTEXT;
    // 预处理列定义，使用 cellFormat 函数自动添加 cell 渲染函数
    const processedColumnMap = React.useMemo(() => {
        if (!Array.isArray(columnDefinitions)) {
            return new Map();
        }
        const processed = applyCellFormat(columnDefinitions, format, context);
        const map = new Map();
        processed.forEach((col) => {
            if (col.dataIndex) {
                map.set(col.dataIndex, col);
            }
        });
        return map;
    }, [columnDefinitions, format, context]);
    /**
     * 简化的单元格渲染函数
     * 直接传入列定义和行数据，自动获取单元格值并渲染
     *
     * @param col 列定义对象（包含 accessorKey/dataIndex 和 cell 函数）
     * @param rowIndex 行索引
     * @param rowData 行数据
     * @returns 渲染结果
     */
    const renderCell = React.useCallback((col, rowIndex, rowData) => {
        if (!col)
            return null;
        // 获取该列的 key
        const key = col.accessorKey || col.dataIndex;
        // 从 processedColumnMap 中获取处理后的列定义（包含 cell 渲染函数）
        const processedCol = processedColumnMap.get(key) || col;
        // 从行数据中获取单元格值
        const value = rowData === null || rowData === void 0 ? void 0 : rowData[key];
        // 优先使用预处理后的 cell 渲染函数
        if (processedCol === null || processedCol === void 0 ? void 0 : processedCol.cell) {
            return processedCol.cell(value, rowIndex, rowData);
        }
        // 如果有 render 函数，也使用它
        if (processedCol === null || processedCol === void 0 ? void 0 : processedCol.render) {
            return processedCol.render(value, rowIndex, rowData);
        }
        // fallback: 直接返回值
        return value !== null && value !== void 0 ? value : null;
    }, [processedColumnMap]);
    /**
     * 兼容旧版的渲染函数
     * 用于 TanStack Table 的 cell 对象
     *
     * @param cell TanStack Table 的 cell 对象
     * @param cellValue 单元格值
     * @param rowIndex 行索引
     * @param rowData 行数据
     * @returns 渲染结果
     */
    const renderCellContent = React.useCallback((cell, cellValue, rowIndex, rowData) => {
        const columnId = cell.column.id;
        const processedCol = processedColumnMap.get(columnId);
        // 优先使用预处理后的 cell 渲染函数
        if (processedCol === null || processedCol === void 0 ? void 0 : processedCol.cell) {
            return processedCol.cell(cellValue, rowIndex, rowData);
        }
        // 如果有 render 函数，也使用它
        if (processedCol === null || processedCol === void 0 ? void 0 : processedCol.render) {
            return processedCol.render(cellValue, rowIndex, rowData);
        }
        // fallback: 使用原来的渲染方式
        const rendered = flexRender(cell.column.columnDef.cell, cell.getContext());
        return rendered !== null && rendered !== void 0 ? rendered : cellValue;
    }, [processedColumnMap]);
    return {
        renderCell,
        renderCellContent,
        processedColumnMap,
    };
}
