// 実際にビルドに載っている訳文のうち、壊れていそうなものを拾う。
// 機械にできるのは「怪しい形」を挙げるところまでで、良し悪しは目で見る。
import fs from 'fs';
const build = fs.readFileSync('build/index.html', 'utf8');
const tm = JSON.parse(fs.readFileSync('tm.json', 'utf8'));
const ov = JSON.parse(fs.readFileSync('overrides.json', 'utf8'));
for (const k in ov) if (!k.startsWith('_')) tm[k] = ov[k];

const flags = [];
for (const en in tm) {
  const ja = tm[en];
  if (typeof ja !== 'string' || !ja.trim()) continue;
  if (!/[ぁ-んァ-ヴ一-龯]/.test(ja)) continue;
  if (!build.includes(ja)) continue;            // ビルドに載っていないものは見ない
  const why = [];

  // 文が助詞で終わっている（訳が途中で切れた形）。断片の訳は元も途中なので、
  // 原文が「.」「!」「?」で終わっている場合だけを見る。
  if (/[.!?]$/.test(en.trim()) && /[はがをにでとのへや、]$/.test(ja.trim())) why.push('助詞で終わっている');

  // 「〜する場合、…は。」のように述語が落ちた形
  if (/[はがを]。$/.test(ja)) why.push('述語が落ちている');

  // 日本語の中に英単語が生のまま残っている（固有名詞と略号は除く）
  const en_left = (ja.match(/[A-Za-z]{4,}/g) || []).filter(w =>
    !/^(HP|MP|XP|STR|DEX|CON|INT|WIS|CHA|Lowmoor|Mereward|Steam|Guild|Vale|Maw|Arc|span|class|div|href|http|https|gold|prestige)$/i.test(w));
  if (en_left.length) why.push('英語が残っている: ' + en_left.slice(0, 3).join(','));

  // 極端に短い／長い
  const r = ja.length / Math.max(1, en.length);
  if (en.length > 25 && r < 0.22) why.push('極端に短い');
  if (en.length > 25 && r > 1.6) why.push('極端に長い');

  // 同じ文字の異様な繰り返し（生成の暴走）
  if (/(.)\1{6,}/.test(ja)) why.push('同じ字の連続');
  if (/(..{2,10}?)\1{3,}/.test(ja)) why.push('同じ句の繰り返し');

  if (why.length) flags.push({ en, ja, why });
}

console.log(`ビルドに載っている訳のうち、怪しいもの: ${flags.length} 件\n`);
const byWhy = {};
for (const f of flags) for (const w of f.why) byWhy[w.split(':')[0]] = (byWhy[w.split(':')[0]] || 0) + 1;
console.log(Object.entries(byWhy).map(([k, v]) => `  ${k}: ${v}`).join('\n'));
console.log();
flags.slice(0, 45).forEach(f => {
  console.log(`[${f.why.join(' / ')}]`);
  console.log(`  ${f.en.slice(0, 88)}`);
  console.log(`  → ${f.ja.slice(0, 88)}`);
});
fs.writeFileSync('suspect.json', JSON.stringify(flags, null, 1));
