import { Injectable, Logger } from '@nestjs/common';

/**
 * AI 输出过滤服务
 * 
 * 过滤 AI 输出中的危险内容
 */
@Injectable()
export class OutputFilterService {
  private readonly logger = new Logger(OutputFilterService.name);

  /**
   * 需要过滤的模式
   */
  private readonly filterPatterns = [
    // 外部 URL（保留内部链接和锚点）
    {
      name: 'external_url',
      regex: /https?:\/\/(?!localhost|127\.0\.0\.1|internal)[^\s)>\]]+/gi,
      replacement: '[链接已移除]',
    },
    // 可执行命令
    {
      name: 'shell_command',
      regex: /```(?:bash|shell|sh|cmd|powershell)\n[\s\S]*?```/gi,
      replacement: '[代码块已移除：出于安全考虑，不显示可执行命令]',
    },
    // System Prompt 泄露检测
    {
      name: 'system_prompt_leak',
      regex: /(?:system\s*prompt|系统提示|内部配置|internal\s*instructions?)[\s:：]*[\s\S]{0,200}/gi,
      replacement: '[内容已过滤]',
    },
    // 危险的 HTML 标签
    {
      name: 'dangerous_html',
      regex: /<(script|iframe|object|embed|form|input)[^>]*>[\s\S]*?<\/\1>|<(?:script|iframe|object|embed|form|input)[^>]*\/>/gi,
      replacement: '[HTML 已移除]',
    },
    // SQL 注入模式
    {
      name: 'sql_injection',
      regex: /(?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC|EXECUTE)\s+[\s\S]*?(?:FROM|INTO|TABLE|DATABASE|;)/gi,
      replacement: '[SQL 已移除]',
    },
  ];

  /**
   * 过滤 AI 输出
   * 
   * @param content AI 原始输出
   * @returns 过滤结果
   */
  filter(content: string): OutputFilterResult {
    let filtered = content;
    const removedItems: RemovedItem[] = [];

    for (const pattern of this.filterPatterns) {
      // 重置正则表达式状态
      pattern.regex.lastIndex = 0;
      
      const matches = content.match(pattern.regex);
      
      if (matches && matches.length > 0) {
        filtered = filtered.replace(pattern.regex, pattern.replacement);
        
        removedItems.push({
          type: pattern.name,
          count: matches.length,
        });

        this.logger.warn(
          `输出过滤: 移除 ${matches.length} 个 ${pattern.name}`,
        );
      }
    }

    return {
      original: content,
      filtered,
      removedItems,
      wasFiltered: removedItems.length > 0,
    };
  }

  /**
   * 检查输出是否安全（不进行过滤）
   */
  isSafe(content: string): boolean {
    for (const pattern of this.filterPatterns) {
      pattern.regex.lastIndex = 0;
      if (pattern.regex.test(content)) {
        return false;
      }
    }
    return true;
  }

  /**
   * 添加安全声明到输出末尾
   */
  addDisclaimer(content: string): string {
    const disclaimer = '\n\n---\n*以上内容仅供参考，不代表公司官方立场。如需确认，请咨询相关部门或使用"转人工"功能。*';
    
    // 避免重复添加
    if (content.includes('仅供参考')) {
      return content;
    }
    
    return content + disclaimer;
  }
}

/**
 * 移除的项目
 */
interface RemovedItem {
  type: string;
  count: number;
}

/**
 * 输出过滤结果
 */
export interface OutputFilterResult {
  original: string;
  filtered: string;
  removedItems: RemovedItem[];
  wasFiltered: boolean;
}
