import { logger } from '../../utils/logger';
import { SemanticLogService } from '../telemetry/SemanticLogService';
import fs from 'fs';
import path from 'path';

/**
 * [BIZ_KER_125] 自动化 Dockerfile 漏洞扫描建议 (Docker Sec)
 * @description 核心逻辑：扫描项目中 Dockerfile 及镜像配置。
 * 识别不安全的镜像基础层、未受限的 root 权限、不必要的敏感文件拷贝等风险。
 * 联动语义日志中心输出 Docker 安全审计报告，并提供优化建议。
 * 遵循 Autocomplete-First (V31.5) 规范。
 */
export class ContainerSecurityService {
  private static readonly DOCKERFILE_PATH = path.join(process.cwd(), 'Dockerfile');

  /**
   * 初始化容器安全扫描
   */
  static async init() {
    logger.info(`[DockerSec] Initializing container security scanner...`);
    this.runScan();
    setInterval(() => this.runScan(), 86400000); // 每日扫描一次
  }

  /**
   * 执行 Dockerfile 静态分析
   * @private
   */
  private static async runScan() {
    try {
      if (!fs.existsSync(this.DOCKERFILE_PATH)) {
        logger.warn(`[DockerSec] Dockerfile not found at ${this.DOCKERFILE_PATH}`);
        return;
      }

      const content = fs.readFileSync(this.DOCKERFILE_PATH, 'utf8');
      const findings: string[] = [];

      // 1. 识别不安全的镜像基础层 (FROM node:latest 或 alpine)
      if (content.includes('FROM node:latest')) {
        findings.push(`⚠️ 使用了 \`node:latest\` 基础镜像。建议锁定具体版本号 (如 \`node:20-alpine\`) 以保证构建可追溯。`);
      }

      // 2. 识别未受限的 root 权限 (没有 USER 指令)
      if (!content.includes('USER ')) {
        findings.push(`❌ Dockerfile 中缺少 \`USER\` 指令。容器将默认以 root 身份运行，存在越权风险。`);
      }

      // 3. 识别不必要的敏感文件拷贝 (COPY . .)
      if (content.includes('COPY . .')) {
        findings.push(`💡 识别到 \`COPY . .\`。请确保已配置 \`.dockerignore\` 以防止 \`.env\` 或 \`.git\` 等敏感目录进入镜像。`);
      }

      const report = this.generateMarkdownReport(findings);
      await SemanticLogService.logSemantic(report, findings.length > 0 ? 'WARN' : 'INFO', 'DOCKER_SECURITY');

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

  /**
   * 生成 Markdown 审计报告
   * @private
   */
  private static generateMarkdownReport(findings: string[]): string {
    return `### 🐳 Container & Docker Security Audit\n\n` +
           `**Status:** ${findings.length > 0 ? '🚨 Security Risks Identified' : '✅ Compliant'}\n\n` +
           `**Audit Findings:**\n` +
           (findings.length > 0 ? findings.map(f => `- ${f}`).join('\n') : '- No critical Dockerfile risks detected.') +
           (findings.length > 0 ? `\n\n**Recommendation:** 请根据上述审计建议优化 Dockerfile 配置，提升容器运行时的安全性。` : '');
  }
}
