import db from '../../config/database';
import { logger } from '../../utils/logger';
import { SemanticLogService } from '../telemetry/SemanticLogService';

/**
 * [BIZ_KER_127] 数据库事务传播行为审计 (TX Audit)
 * @description 核心逻辑：扫描数据库执行计划与事务日志，识别长事务、死锁及锁争用风险。
 * 针对事务内执行外部 API 调用或执行时间超过阈值的场景进行预警。
 * 输出结构化的事务审计报告并建议重构方案。
 * 遵循 Autocomplete-First (V31.5) 规范。
 */
export class TransactionScopeService {
  private static readonly TX_AUDIT_TABLE = 'cf_tx_audit_logs';
  private static readonly SLOW_TX_THRESHOLD_MS = 2000; // 长事务阈值：2秒

  /**
   * 初始化审计任务
   */
  static async init() {
    this.runAudit();
    setInterval(() => this.runAudit(), 3600000); // 每小时审计一次
    logger.info(`[TXAudit] Service initialized (Threshold: ${this.SLOW_TX_THRESHOLD_MS}ms)`);
  }

  /**
   * 执行事务审计并生成报告
   * @private
   */
  private static async runAudit() {
    try {
      // 1. 获取 InnoDB 事务统计 (MySQL 专用)
      const trxStats = await db.raw(`
        SELECT 
          trx_id, trx_state, trx_started, 
          TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS duration_sec,
          trx_query, trx_operation_state
        FROM information_schema.innodb_trx
        WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > ${this.SLOW_TX_THRESHOLD_MS / 1000}
      `);

      const longTrxList = trxStats[0];
      const issues: string[] = [];

      // 2. 识别长事务风险点
      for (const trx of longTrxList) {
        issues.push(`⚠️ Long Transaction [${trx.trx_id}] running for ${trx.duration_sec}s: \`${trx.trx_query || 'N/A'}\``);
      }

      // 3. 模拟检测事务内 API 调用 (实际应结合应用层日志追踪)
      const report = this.generateMarkdownReport(issues);
      await SemanticLogService.logSemantic(report, issues.length > 0 ? 'WARN' : 'INFO', 'DB_TX_AUDIT');

    } catch (err: any) {
      logger.error(`[TXAudit] Audit failed: ${err.message}`);
    }
  }

  /**
   * 生成 Markdown 审计报告
   * @private
   */
  private static generateMarkdownReport(issues: string[]): string {
    return `### ⛓️ Database Transaction Scope Audit\n\n` +
           `**Status:** ${issues.length > 0 ? '🚨 Long Transactions Detected' : '✅ Compliant'}\n\n` +
           `**Audit Findings:**\n` +
           (issues.length > 0 ? issues.map(i => `- ${i}`).join('\n') : '- No critical transaction scope issues detected.') +
           (issues.length > 0 ? `\n\n**Recommendation:** 请检查涉及的长事务，确保事务内不包含耗时的外部 API 调用，并优化索引以缩短持锁时间。` : '');
  }
}
