import type { TriggerInfo } from './types';
import type { NodeVariable } from '@/utils/workflow/collectNodeVariables';

/**
 * 检测是否应该触发变量建议
 * 
 * 检测逻辑：
 * 1. 查找光标前最后一个 ${ 的位置
 * 2. 确保 ${ 和光标之间没有 }（未闭合）
 * 3. 确保距离不超过 100 个字符（避免过长的搜索）
 * 4. 确保用户还在输入变量名，而不是比较逻辑
 * 
 * @param text 完整文本内容
 * @param cursorPos 光标位置（从 0 开始）
 * @returns 触发信息（包含是否显示、起始位置、搜索文本）
 * 
 * @example
 * detectTrigger("Hello ${jen", 11) 
 * // => { shouldShow: true, startPos: 6, searchText: "jen" }
 * 
 * @example
 * detectTrigger("${var == ", 9)
 * // => { shouldShow: false, startPos: -1, searchText: '' } // 已经在输入比较逻辑
 */
export const detectTrigger = (text: string, cursorPos: number): TriggerInfo => {
    // 获取光标前的文本
    const beforeCursor = text.substring(0, cursorPos);
    
    // 找到最后一个 ${
    const lastOpenIndex = beforeCursor.lastIndexOf('${');
    
    // 如果没有找到 ${，或者找到的位置在很早之前（超过100个字符），不触发
    if (lastOpenIndex === -1 || (cursorPos - lastOpenIndex) > 100) {
        return { shouldShow: false, startPos: -1, searchText: '' };
    }
    
    // 获取 ${ 之后到光标的文本
    const textAfterOpen = beforeCursor.substring(lastOpenIndex + 2);
    
    // 如果这段文本中已经有 }，说明表达式已经闭合，不触发
    if (textAfterOpen.includes('}')) {
        return { shouldShow: false, startPos: -1, searchText: '' };
    }
    
    // ✅ 关键优化：检测是否包含比较运算符或逻辑运算符
    // 如果用户已经在输入比较逻辑，则不显示变量提示
    const hasOperators = /[=!<>&|]{1,2}|&&|\|\|/.test(textAfterOpen);
    if (hasOperators) {
        return { shouldShow: false, startPos: -1, searchText: '' };
    }
    
    // 返回触发信息
    return {
        shouldShow: true,
        startPos: lastOpenIndex,
        searchText: textAfterOpen.trim(),
    };
};

/**
 * 插入变量到文本中
 * 
 * 将用户选择的变量插入到文本中，替换 ${ 和光标之间的部分
 * 
 * @param originalText 原始文本内容
 * @param cursorPos 当前光标位置
 * @param triggerStartPos ${ 符号的起始位置
 * @param nodeName 节点显示名称（用于生成 ${nodeName.fieldName}）
 * @param fieldName 字段名称
 * @returns 包含新文本和新光标位置的对象
 * 
 * @example
 * insertVariable("Hello ${jen", 11, 6, "Jenkins构建", "buildNumber")
 * // => { newText: "Hello ${Jenkins构建.buildNumber}", newCursorPos: 30 }
 * // 光标位置在 } 之前，可以继续输入比较逻辑
 */
export const insertVariable = (
    originalText: string,
    cursorPos: number,
    triggerStartPos: number,
    nodeName: string,
    fieldName: string
): { newText: string; newCursorPos: number } => {
    // ${ 之前的文本
    const before = originalText.substring(0, triggerStartPos);
    
    // 光标之后的文本
    const after = originalText.substring(cursorPos);
    
    // 构建新文本：before + ${nodeName.fieldName} + after
    const variableText = `\${${nodeName}.${fieldName}}`;
    const newText = `${before}${variableText}${after}`;
    
    // ✅ 关键修改：将光标定位在 } 之前，方便用户继续输入比较逻辑
    // 例如：${nodeName.fieldName|} → 用户可以直接输入 " == 'value'"
    const newCursorPos = before.length + variableText.length - 1;
    
    return { newText, newCursorPos };
};

/**
 * 过滤变量列表
 * 
 * @param variables 所有变量
 * @param searchText 搜索文本
 * @returns 过滤后的变量列表
 */
export const filterVariables = (variables: NodeVariable[], searchText: string): NodeVariable[] => {
    if (!searchText) {
        return variables;
    }
    
    const lowerSearch = searchText.toLowerCase();
    
    return variables.filter(v => {
        // 匹配节点名称或字段名
        const matchesNodeName = v.nodeName?.toLowerCase().includes(lowerSearch);
        const matchesFieldName = v.fieldName?.toLowerCase().includes(lowerSearch);
        const matchesFullText = v.fullText?.toLowerCase().includes(lowerSearch);
        
        return matchesNodeName || matchesFieldName || matchesFullText;
    });
};

