// 連結断片の手直し。
//
// 末尾が開始タグ（<b> など）の断片は、そこに値が差し込まれる。日本語は
// 「値 → 述語」の順なので、述語を後ろの断片に送り、前の断片はタグで終わらせる。
// 機械には割れない切り方なので、対で手で書く。
import fs from 'fs';

const flagged = JSON.parse(fs.readFileSync('tag-moved.json', 'utf8'));
const ov = JSON.parse(fs.readFileSync('overrides.json', 'utf8'));

// 末尾（一意に決まる範囲）→ 日本語。前の断片はタグで終える。
const A_FIX = [
  ["a drawer opens in the stone and pays out <span class='lg-gold'>",
   'あなたは自分の数字を、町自身の筆跡でその彩色台帳に書き入れる。町はそれを認め、石に引き出しが開いて<span class=\'lg-gold\'>'],
  ["and the box gives up <span class='lg-gold'>",
   'あなたは護符を順に読み、一つずつ収めていく。やがて箱が手放したのは<span class=\'lg-gold\'>'],
  ["An hour's honest labour at the hermit's woodpile earns you +1 <b>",
   '隠者の薪山で一時間まじめに働いて得たのは、+1 <b>'],
  ['Over tea in the hermit\'s cell you are taught <b>',
   '隠者の庵で茶を飲みながら教わったのは、<b>'],
  ['A grateful townsman teaches you <b>',
   '礼を言う町人が教えてくれたのは、<b>'],
  ['You carry out of this chapter <b>',
   'この章から持ち出したのは、<b>'],
  ['Your kit reaches item level <b>',
   '装備一式のアイテムレベルが <b>'],
  ['The Guild has entered the descent as <b>',
   'ギルドはこの下降を <b>'],
  ['</b> experience, and in the battle you have learned <b>',
   '</b> の経験を得た。戦いのなかで身につけたのは <b>'],
  ['The Guild enters you upon the list for <b>',
   'ギルドがあなたを名簿に載せた。その項目は <b>'],
  [' gold pieces. The last of them is <b>',
   ' ゴールド。その最後の一つは <b>'],
  [' Your purse holds <b id="guildpurse">',
   ' 手持ちは <b id="guildpurse">'],
  ['the Guild has still to raise <b>', 'ギルドがなお集めねばならないのは <b>'],
  ['the deep has yet to give up <b>', '深がまだ手放していないのは <b>'],
  ['the floor below is held by <b>', '下の階を占めているのは <b>'],
  ['The way down is barred by <b>', '下りの道を塞いでいるのは <b>'],
  [' the deed is entered for <b>', ' この功は <b>'],
  ['The dice are cast upon a <b>', '賽が投じられた。その目は <b>'],
  [" for <span class='lg-gold'>", "、<span class='lg-gold'>"],
  ['Your schooling provides <b>', '修学が与えるのは <b>'],
  [', and you have learned <b>', '、そして身につけたのは <b>'],
  ['The cataloguers hang <b>', '目録係が掛けたのは <b>'],
  [' brings the count to <b>', ' により、その数は <b>'],
  ['The Guild unlocks <b>', 'ギルドが解禁したのは <b>'],
  ['The house hires <b>', '家が雇い入れたのは <b>'],
  ['<div>You hold <b>', '<div>手にしているのは <b>'],
  ['You keep <b>', '手元に残るのは <b>'],
  ['You take <b>', '手にしたのは <b>'],
  ['the <b>', 'その <b>'],
];

// 後ろの断片（閉じタグ始まり）も、前を名詞で終えた形に合わせて直す。
const B_FIX = {
  ' gold pieces</span> against an account that was never opened.':
    ' ゴールド</span>。開かれたことのない口座から支払われた。',
  ' gold pieces</span> of old dwarven coin.': ' ゴールド</span>の古いドワーフ貨だった。',
  '</b> and the old man': '</b> と、老人の',
  '</b>, and the learning of it comes easily.': '</b>。その習得は苦もなく進む。',
  '</b>, and it opens an answer to the letter at the hall door.':
    '</b>。それが広間の扉の手紙への答えを開く。',
  '</b>. It wears ': '</b> に達した。身に着けているのは ',
  '</b>.': '</b>。',
  ' gold pieces</b>.': ' ゴールド</b>。',
};

const tmAll = JSON.parse(fs.readFileSync('tm.json', 'utf8'));

let a = 0;
for (const [tail, ja] of A_FIX) {
  const keys = flagged.filter(k => k.endsWith(tail));
  if (!keys.length) { console.log('  ! 該当なし:', JSON.stringify(tail.slice(0, 50))); continue; }
  for (const k of keys) {
    const head = k.slice(0, k.length - tail.length);
    if (!head) { ov[k] = ja; a++; continue; }

    // 前置きが長い断片（"<br><br>The road runs on…" など）は、その部分の既訳を
    // 活かしたい。既訳から「タグとその後ろ」を切り落とし、手書きの締めを継ぐ。
    const prev = tmAll[k];
    if (!prev) { console.log('  ! 既訳なし:', JSON.stringify(k.slice(0, 40))); continue; }
    // 切るのは「最後の」タグから。先頭の <br><br> まで巻き込むと本文が消える。
    const tags = [...prev.matchAll(/<\/?[a-zA-Z][^>]*>/g)];
    const cut = tags.length ? tags[tags.length - 1].index : prev.length;
    const body = prev.slice(0, cut).trim();
    ov[k] = body + ja;
    a++;
  }
}
let b = 0;
for (const [en, ja] of Object.entries(B_FIX)) { ov[en] = ja; b++; }

fs.writeFileSync('overrides.json', JSON.stringify(ov, null, 1));
console.log(`前の断片 ${a} 件 / 後ろの断片 ${b} 件を手直しして overrides.json に入れました`);
