/**
 * Prompt 相关工具函数
 */
import { extractCellTextValue } from '../../../../../../../cn-ai-table/view/components/views/table-view/cell-format/text-extractors';
/** 变量匹配正则 */
const VARIABLE_REGEX = /\$\{(\w+)\}/g;
/**
 * 解析 prompt 中的变量
 * @param text - 包含 ${variable} 格式变量的文本
 * @returns 变量名数组（去重）
 */
export function parsePromptVariables(text) {
    const variables = [];
    let match = VARIABLE_REGEX.exec(text);
    // 重置正则状态
    VARIABLE_REGEX.lastIndex = 0;
    while ((match = VARIABLE_REGEX.exec(text)) !== null) {
        if (!variables.includes(match[1])) {
            variables.push(match[1]);
        }
    }
    return variables;
}
/**
 * 检查 prompt 是否包含变量
 */
export function hasPromptVariables(text) {
    return parsePromptVariables(text).length > 0;
}
/**
 * 根据行数据和变量名构建 promptParams
 */
export function buildPromptParams(row, variables) {
    const params = {};
    variables.forEach((varName) => {
        params[varName] = row[varName] !== undefined ? String(row[varName]) : '';
    });
    return params;
}
/**
 * 使用 extractCellTextValue 构建 promptParams（格式化显示值优先，原始值兜底）。
 *
 * 所有构建 promptParams 的场景（批量任务、单元格任务、预览）均应调用此函数，
 * 保持与 row-data-cache 相同的取值口径。
 *
 * @param row            行原始数据
 * @param variables      prompt 中解析到的变量名
 * @param allColumns     全量列定义数组（dataModel.columnDefinitions）
 * @param processedColumnMap 处理后的列定义映射（dataModel.processedColumnMap）
 * @param rowIndex       当前行在目标集合中的索引，用于 cell render 等场景
 */
export function buildPromptParamsWithExtractor(row, variables, allColumns, processedColumnMap, rowIndex = 0) {
    if (variables.length === 0)
        return {};
    const params = {};
    // 预构建变量 → 列定义映射
    const variableColumnMap = new Map();
    variables.forEach((varName) => {
        const column = allColumns.find((col) => col.dataIndex === varName);
        if (column) {
            variableColumnMap.set(varName, {
                column,
                processedColumn: processedColumnMap.get(varName),
            });
        }
    });
    variables.forEach((varName) => {
        const columnInfo = variableColumnMap.get(varName);
        if (columnInfo) {
            const result = extractCellTextValue(row[varName], columnInfo.column, row, columnInfo.processedColumn, undefined, rowIndex);
            params[varName] = result.text;
        }
        else {
            const rawValue = row[varName];
            params[varName] = rawValue != null ? String(rawValue) : '';
        }
    });
    return params;
}
/**
 * 补充字段名称：如果变量前面没有字段名称，则自动补充
 * @param prompt - 原始 prompt
 * @param fields - 字段列表
 * @returns 补充后的 prompt
 */
export function enrichPromptWithFieldNames(prompt, fields) {
    if (!prompt || !hasPromptVariables(prompt)) {
        return prompt;
    }
    const fieldMap = new Map();
    fields.forEach((field) => {
        fieldMap.set(field.dataIndex, field);
    });
    // 解析所有变量及其位置（使用原始 prompt）
    const VARIABLE_REGEX = /\$\{(\w+)\}/g;
    const matches = [];
    // 重置正则状态
    VARIABLE_REGEX.lastIndex = 0;
    let match = VARIABLE_REGEX.exec(prompt);
    while (match !== null) {
        matches.push({
            varName: match[1],
            index: match.index,
            fullMatch: match[0],
        });
        match = VARIABLE_REGEX.exec(prompt);
    }
    // 从后往前处理，避免索引偏移问题（后面的修改不影响前面的索引）
    let enrichedPrompt = prompt;
    for (let i = matches.length - 1; i >= 0; i--) {
        const { varName, index, fullMatch } = matches[i];
        const field = fieldMap.get(varName);
        if (!field) {
            // 如果找不到对应的字段，跳过
            continue;
        }
        const fieldTitle = field.title;
        // 获取变量前面的文本（最多检查前50个字符）
        const beforeText = enrichedPrompt.substring(Math.max(0, index - 50), index);
        // 检查前面是否已经包含字段名称
        // 检查是否包含 "字段名：" 或 "字段名：" 这样的格式，或者字段名紧挨着变量
        const hasFieldName = beforeText.includes(`${fieldTitle}：`) ||
            beforeText.includes(`${fieldTitle}:`) ||
            beforeText.trim().endsWith(fieldTitle);
        // 如果前面没有字段名称，则补充
        if (!hasFieldName) {
            // 检查前面是否有其他文本
            const textBefore = enrichedPrompt.substring(0, index).trim();
            // 如果前面有文本且不是以冒号结尾，则添加字段名和中文冒号
            const prefix = textBefore.length > 0 && !textBefore.endsWith('：') && !textBefore.endsWith(':')
                ? `${fieldTitle}：`
                : `${fieldTitle}：`;
            // 插入字段名称
            enrichedPrompt =
                enrichedPrompt.substring(0, index) +
                    prefix +
                    fullMatch +
                    enrichedPrompt.substring(index + fullMatch.length);
        }
    }
    return enrichedPrompt;
}
