#!/usr/bin/env tsx
/**
 * 国际化检查脚本
 * 检查项目中所有缺少国际化的中文文本
 */

import fs from 'fs';
import path from 'path';
import { glob } from 'glob';

interface I18nIssue {
  file: string;
  line: number;
  content: string;
  context: string;
  type: 'hardcoded-chinese' | 'hardcoded-english' | 'missing-translation';
}

// 排除的目录和文件
const EXCLUDE_PATTERNS = [
  '**/node_modules/**',
  '**/locales/**', // 翻译文件本身
  '**/*.test.{ts,tsx}',
  '**/*.spec.{ts,tsx}',
  '**/dist/**',
  '**/.next/**',
];

// 中文字符正则
const CHINESE_REGEX = /[\u4e00-\u9fa5]+/g;

// 常见的硬编码英文文本（标题、按钮等）
const HARDCODED_ENGLISH_PATTERNS = [
  /["'](?:Save|Cancel|Delete|Edit|Add|Create|Update|Submit|Close|Search|Filter|Export|Import|Back|Next|Previous|Confirm|Reset|Clear|Copy|Paste|Cut|Download|Upload)["']/g,
  /["'](?:Username|Password|Email|Phone|Name|Title|Description|Status|Date|Time|Action|Type|Category)["']/g,
];

async function findFiles(): Promise<string[]> {
  return glob('frontend/src/**/*.{ts,tsx}', {
    ignore: EXCLUDE_PATTERNS,
    absolute: true,
  });
}

function checkFile(filePath: string): I18nIssue[] {
  const issues: I18nIssue[] = [];
  const content = fs.readFileSync(filePath, 'utf-8');
  const lines = content.split('\n');

  lines.forEach((line, index) => {
    // 跳过导入语句和注释
    if (line.trim().startsWith('import ') || 
        line.trim().startsWith('//') || 
        line.trim().startsWith('/*') ||
        line.trim().startsWith('*')) {
      return;
    }

    // 检查中文硬编码
    const chineseMatches = line.match(CHINESE_REGEX);
    if (chineseMatches) {
      issues.push({
        file: filePath,
        line: index + 1,
        content: chineseMatches.join(''),
        context: line.trim(),
        type: 'hardcoded-chinese',
      });
    }

    // 检查英文硬编码（简单检测，可能有误报）
    HARDCODED_ENGLISH_PATTERNS.forEach(pattern => {
      const englishMatches = line.match(pattern);
      if (englishMatches && !line.includes('t.') && !line.includes('t[')) {
        issues.push({
          file: filePath,
          line: index + 1,
          content: englishMatches.join(', '),
          context: line.trim(),
          type: 'hardcoded-english',
        });
      }
    });
  });

  return issues;
}

async function main() {
  console.log('🔍 开始检查国际化...\n');

  const files = await findFiles();
  console.log(`📁 找到 ${files.length} 个文件\n`);

  const allIssues: I18nIssue[] = [];

  for (const file of files) {
    const issues = checkFile(file);
    allIssues.push(...issues);
  }

  // 统计
  const chineseIssues = allIssues.filter(i => i.type === 'hardcoded-chinese');
  const englishIssues = allIssues.filter(i => i.type === 'hardcoded-english');

  // 按文件分组
  const issuesByFile = allIssues.reduce((acc, issue) => {
    const relPath = path.relative(process.cwd(), issue.file);
    if (!acc[relPath]) {
      acc[relPath] = [];
    }
    acc[relPath].push(issue);
    return acc;
  }, {} as Record<string, I18nIssue[]>);

  // 生成报告
  console.log('📊 检查结果\n');
  console.log('='.repeat(80));
  console.log(`总计问题: ${allIssues.length}`);
  console.log(`  - 硬编码中文: ${chineseIssues.length}`);
  console.log(`  - 硬编码英文: ${englishIssues.length}`);
  console.log('='.repeat(80));
  console.log('');

  if (allIssues.length === 0) {
    console.log('✅ 没有发现国际化问题！');
    return;
  }

  // 输出详细报告
  console.log('📄 详细报告\n');

  Object.entries(issuesByFile)
    .sort((a, b) => b[1].length - a[1].length) // 按问题数量排序
    .slice(0, 20) // 只显示前 20 个文件
    .forEach(([file, issues]) => {
      console.log(`\n📁 ${file} (${issues.length} 个问题)`);
      console.log('-'.repeat(80));

      issues.slice(0, 5).forEach(issue => { // 每个文件只显示前 5 个
        const type = issue.type === 'hardcoded-chinese' ? '🇨🇳' : '🔤';
        console.log(`  ${type} 第 ${issue.line} 行: ${issue.content}`);
        console.log(`     ${issue.context.slice(0, 100)}${issue.context.length > 100 ? '...' : ''}`);
      });

      if (issues.length > 5) {
        console.log(`     ... 还有 ${issues.length - 5} 个问题`);
      }
    });

  // 保存完整报告到文件
  const report = {
    timestamp: new Date().toISOString(),
    summary: {
      total: allIssues.length,
      chineseIssues: chineseIssues.length,
      englishIssues: englishIssues.length,
      filesWithIssues: Object.keys(issuesByFile).length,
    },
    issues: issuesByFile,
  };

  const reportPath = path.join(process.cwd(), 'i18n-report.json');
  fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));

  console.log(`\n\n📝 完整报告已保存到: ${reportPath}`);
  console.log('\n💡 提示：这是初步检测，可能有误报。请人工审查后决定是否需要添加国际化。');
}

main().catch(console.error);

