"use strict";
/**
 * 从表格中提取数据，生成 AI 可消费的格式
 *
 * 重构说明：
 * - 使用 text-extractors 模块进行文本提取
 * - 支持多种格式类型的高效提取
 * - 对于自定义 cell 函数，回退到 React 渲染方式
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSupportedFormats = exports.clearCustomExtractors = exports.registerTextExtractor = void 0;
exports.extractTextFromElement = extractTextFromElement;
exports.extractCellText = extractCellText;
exports.extractRowData = extractRowData;
exports.extractAllRowsData = extractAllRowsData;
exports.extractDataFromModelWithFormat = extractDataFromModelWithFormat;
exports.extractSingleCellText = extractSingleCellText;
exports.extractDataFromModel = extractDataFromModel;
exports.extractDataFromDOM = extractDataFromDOM;
const text_extractors_1 = require("../cell-format/text-extractors");
Object.defineProperty(exports, "registerTextExtractor", { enumerable: true, get: function () { return text_extractors_1.registerTextExtractor; } });
Object.defineProperty(exports, "clearCustomExtractors", { enumerable: true, get: function () { return text_extractors_1.clearCustomExtractors; } });
Object.defineProperty(exports, "getSupportedFormats", { enumerable: true, get: function () { return text_extractors_1.getSupportedFormats; } });
/**
 * 从 DOM 元素中提取文本内容（递归提取所有文本节点）
 */
function extractTextFromElement(element) {
    var _a, _b;
    if (!element)
        return '';
    // 如果是文本节点，直接返回
    if (element.nodeType === Node.TEXT_NODE) {
        return ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || '';
    }
    // 递归提取所有子节点的文本
    let text = '';
    for (const node of Array.from(element.childNodes)) {
        if (node.nodeType === Node.TEXT_NODE) {
            text += ((_b = node.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || '';
        }
        else if (node.nodeType === Node.ELEMENT_NODE) {
            text += extractTextFromElement(node);
        }
    }
    return text.trim();
}
/**
 * 从表格单元格 DOM 元素中提取文本内容
 * @param cellElement 单元格 DOM 元素（通常是 td 元素）
 * @returns 提取的文本内容
 */
function extractCellText(cellElement) {
    if (!cellElement)
        return '';
    // 查找 .ai-table-cell-content 元素
    const contentElement = cellElement.querySelector('.ai-table-cell-content');
    if (contentElement) {
        return extractTextFromElement(contentElement);
    }
    // 如果没有找到，尝试从整个单元格提取
    return extractTextFromElement(cellElement);
}
/**
 * 从表格中提取单行数据
 * @param rowElement 表格行 DOM 元素（tr 元素）
 * @param columnDataIndexes 列的数据索引数组（按顺序）
 * @returns 对象格式的数据，如 { DatePicker_1: "2022-12-03", ... }
 */
function extractRowData(rowElement, columnDataIndexes) {
    if (!rowElement)
        return {};
    const rowData = {};
    const cells = rowElement.querySelectorAll('.ai-table-data-cell:not(.ai-table-operate-column-cell)');
    // 遍历所有数据单元格（排除操作列）
    cells.forEach((cell, index) => {
        if (index < columnDataIndexes.length) {
            const dataIndex = columnDataIndexes[index];
            const text = extractCellText(cell);
            rowData[dataIndex] = text;
        }
    });
    return rowData;
}
/**
 * 从表格中提取所有行数据
 * @param tableElement 表格 DOM 元素（table 元素）
 * @param columnDataIndexes 列的数据索引数组（按顺序）
 * @returns 数组格式的数据，每行一个对象
 */
function extractAllRowsData(tableElement, columnDataIndexes) {
    if (!tableElement)
        return [];
    const rows = [];
    const rowElements = tableElement.querySelectorAll('tbody tr:not(.ai-table-group-row)');
    rowElements.forEach((rowElement) => {
        const rowData = extractRowData(rowElement, columnDataIndexes);
        if (Object.keys(rowData).length > 0) {
            rows.push(rowData);
        }
    });
    return rows;
}
/**
 * 从表格视图数据模型中提取数据（使用格式化函数获取显示文本）
 *
 * 重构后的实现：
 * - 使用 text-extractors 模块的 extractRowsData 函数
 * - 支持多种格式类型的高效提取（不需要 React 渲染）
 * - 对于自定义 cell 函数，自动回退到 React 渲染方式
 * - 支持自定义提取器注册
 *
 * @param viewData 视图数据数组
 * @param allColumns 全量列定义数组（所有字段，不仅仅是可见字段）
 * @param processedColumnMap 处理后的列定义映射（包含 cell 渲染函数）
 * @param primaryKey 主键（字段名或函数），用于生成 id
 * @param context 本地化上下文（可选）
 * @returns 数组格式的数据，每行一个对象，值为格式化后的文本，包含 id 字段
 */
function extractDataFromModelWithFormat(viewData, allColumns, processedColumnMap, primaryKey, context) {
    return (0, text_extractors_1.extractRowsData)(viewData, allColumns, processedColumnMap, primaryKey, context);
}
/**
 * 从单个单元格提取文本（便于单独使用）
 *
 * @param value 原始值
 * @param column 列配置
 * @param record 行数据
 * @param processedColumn 处理后的列配置
 * @param context 本地化上下文
 * @param rowIndex 行索引
 */
function extractSingleCellText(value, column, record, processedColumn, context, rowIndex = 0) {
    const result = (0, text_extractors_1.extractCellTextValue)(value, column, record, processedColumn, context, rowIndex);
    return result.text;
}
/**
 * 从表格视图数据模型中提取数据（推荐方式，更可靠，但不包含格式化）
 * @param viewData 视图数据数组
 * @param viewColumns 视图列定义数组
 * @returns 数组格式的数据，每行一个对象
 */
function extractDataFromModel(viewData, viewColumns) {
    return viewData.map((row) => {
        const rowData = {};
        viewColumns.forEach((col) => {
            const value = row[col.dataIndex];
            // 将值转换为字符串（如果是对象或数组，使用 JSON.stringify）
            if (value === null || value === undefined) {
                rowData[col.dataIndex] = '';
            }
            else if (typeof value === 'object') {
                rowData[col.dataIndex] = JSON.stringify(value);
            }
            else {
                rowData[col.dataIndex] = String(value);
            }
        });
        return rowData;
    });
}
/**
 * 从表格 DOM 中提取数据（如果需要显示格式的值）
 * @param tableSelector 表格选择器（如 '.ai-table-table'）
 * @param columnDataIndexes 列的数据索引数组（按顺序）
 * @returns 数组格式的数据，每行一个对象
 */
function extractDataFromDOM(tableSelector, columnDataIndexes) {
    const tableElement = document.querySelector(tableSelector);
    return extractAllRowsData(tableElement, columnDataIndexes);
}
