// 通し翻訳のあと、tm.json に入らなかった分だけを拾い直す。
//
//   node retry-warned.mjs plamo-all.json           -- 何件残っているか見る
//   node retry-warned.mjs plamo-all.json --run     -- 温度を上げて引き直す
//
// 落ちる理由はほぼ二つ。生成が崩れたか、コード側のプレースホルダ
// （${...} やタグ）が訳文から消えたか。どちらも引き直すと通ることが多い。
import fs from 'fs';

const GATEWAY = process.env.PLAMO_GATEWAY || 'http://127.0.0.1:8080';
const TM = 'tm.json';
const file = process.argv[2] || 'plamo-all.json';
const doRun = process.argv.includes('--run');

const all = JSON.parse(fs.readFileSync(file, 'utf8'));
const tm = JSON.parse(fs.readFileSync(TM, 'utf8'));
const missing = all.filter(s => !(s in tm));

console.log(`${file}: ${all.length} 件中 ${missing.length} 件が未採用`);
if (!missing.length || !doRun) {
  missing.slice(0, 10).forEach(s => console.log('  ·', JSON.stringify(s.slice(0, 90))));
  if (missing.length && !doRun) console.log('\n--run を付けると引き直します。');
  process.exit(0);
}

let ok = 0, still = 0;
for (let i = 0; i < missing.length; i++) {
  const text = missing[i];
  let got = null;
  // 温度を変えて三度まで。同じ引き方で三度やっても同じところで崩れる。
  for (const temperature of [0, 0.3, 0.6]) {
    const r = await (await fetch(GATEWAY + '/api/translate', {
      method: 'POST', headers: { 'content-type': 'application/json' },
      body: JSON.stringify({ text, src: 'en', tgt: 'ja', profile: 'game', useTM: false, temperature }),
    })).json();
    if (!r.warning && !r.error) { got = r.text; break; }
  }
  if (got) { tm[text] = got; ok++; } else still++;
  if (i % 10 === 9 || i === missing.length - 1) {
    fs.writeFileSync(TM, JSON.stringify(tm, null, 1));
    process.stdout.write(`\r  ${i + 1}/${missing.length}  回収 ${ok}  なお不可 ${still}   `);
  }
}
console.log(`\n回収 ${ok} 件 / なお不可 ${still} 件`);
if (still) console.log('残った分は英語のままになります（patch.mjs が原文を残します）。');
