// 設定に「字体」の切替を足す。patch.mjs から呼ばれる。
//
// ・Windows に元から入っている 4 書体は、指定するだけ。
// ・OFL の 3 書体は、使う文字だけに絞った woff2 を base64 で埋め込む。
//   外に取りに行かないので、ゲームの「通信しない」という約束は保たれる。
// ・選択は localStorage に持つ。セーブには入れない（機械ごとの好みであって、
//   冒険者の記録ではない）。
// ・書体ごとに適正な字の大きさが違うので、大きさも一緒に切り替える。
import fs from 'fs';
import path from 'path';

const FONTDIR = process.env.PLAMO_FONTDIR || 'F:/PLaMo/fonts';

// @font-face に付ける名前は、下の FACES の stack と一字一句そろえること。
// ここを "ZenOldMincho"、stack を "Zen Old Mincho" と書き分けてしまい、
// 埋め込んだのに読み込まれず、黙ってシステムのフォントに落ちていた。
// 名前が合わないだけなので、例外も出ず lint も通る。
const WEB = [
  { css: 'Zen Old Mincho', file: 'ZenOldMincho.woff2' },
  { css: 'Klee One', file: 'KleeOne.woff2' },
  { css: 'DotGothic16', file: 'DotGothic16.woff2' },
];

// 選べる字体。stack はそのまま font-family に入る。px は本文の大きさ。
export const FACES = [
  ['gothic', 'MS Pゴシック（既定）', '"MS PGothic","MS Gothic"', 11],
  ['mincho', 'MS P明朝', '"MS PMincho","MS Mincho"', 11],
  ['bizmincho', 'BIZ UD P明朝', '"BIZ UDPMincho"', 12],
  ['kyokasho', 'UDデジタル教科書体', '"UD Digi Kyokasho NP-R","UD Digi Kyokasho NP"', 12],
  ['zenold', 'Zen Old Mincho（古書）', '"Zen Old Mincho"', 12],
  ['klee', 'Klee One（手書き）', '"Klee One"', 12],
  // ドット字は設計サイズが 16px。12px に落とすと点が潰れて、ただのゴシックに
  // 見えてしまう（実測して確認した）。16px のままにする代わり、窓が狭いと
  // 収まらないので、設定の説明でそう断っておく。1920 幅では溢れない。
  ['dot', 'DotGothic16（ドット・要広窓）', '"DotGothic16"', 16],
];

export function addFontSwitcher(html, log = console.log) {
  if (html.includes('JAFONT_KEY')) { log('  字体の切替: すでに入っています'); return html; }

  /* ---- 1. @font-face を埋め込む ------------------------------------ */
  let css = '\n  /* 同梱の字体。使う文字だけに絞った woff2 を埋め込んである。外へは取りに行かない。 */\n';
  let embedded = 0;
  for (const w of WEB) {
    const p = path.join(FONTDIR, w.file);
    if (!fs.existsSync(p)) { log('  ! 字体が見つからない: ' + p); continue; }
    const b64 = fs.readFileSync(p).toString('base64');
    css += `  @font-face{font-family:"${w.css}";font-style:normal;font-weight:400;font-display:block;`
      + `src:url(data:font/woff2;base64,${b64}) format("woff2");}\n`;
    embedded += b64.length;
  }
  // 切替が効くよう、字体と大きさは変数にしておく
  css += '  :root{ --ja-face: "MS PGothic","MS Gothic"; --ja-size: 11px; }\n'
    + '  body, button, input, select, textarea, table, td, th{\n'
    + '    font-family: Tahoma,"MS Sans Serif",var(--ja-face),Geneva,sans-serif;\n'
    + '    font-size: var(--ja-size);\n  }\n';
  html = html.replace('</style>', css + '</style>');

  /* ---- 2. 設定画面に行を足す --------------------------------------- */
  const row = '        <div class="optrow" data-helptitle="字体"\n'
    + '          data-help="画面全体の日本語の字体を変えます。上の四つは Windows に元から入っているもの、'
    + '下の三つはこのファイルの中に同梱してあるものです。どれを選んでも外に通信は出ず、'
    + '別途フォントを入れておく必要もありません。選んだ字体はこの機械にだけ憶えます。'
    + 'ドット字体は字が大きいので、窓を広めにしてお使いください。">\n'
    + '          <label for="opt-jafont">字体</label>\n'
    + '          <select id="opt-jafont" aria-label="字体">\n'
    + FACES.map(([id, label]) => `            <option value="${id}">${label}</option>`).join('\n') + '\n'
    + '          </select>\n        </div>\n';
  const anchor = '<label class="optrow"><input type="checkbox" id="opt-hicontrast">';
  const i = html.indexOf(anchor);
  if (i < 0) throw new Error('設定画面の差し込み位置が見つかりません');
  html = html.slice(0, i) + row + '        ' + html.slice(i);

  /* ---- 3. 動かす JS ------------------------------------------------ */
  const js = `
/* ---------- 字体の切替 ----------
   書体ごとに適正な大きさが違う（ドット字は設計サイズが決まっていて、外れると
   にじむ）ので、字体と一緒に大きさも切り替える。選択はこの機械に憶える。 */
const JAFONT_KEY = "lowmoor.jafont.v1";
const JA_FACES = ${JSON.stringify(Object.fromEntries(FACES.map(([id, , stack, px]) => [id, { stack, px }])))};
let jaFace = "gothic";
function applyJaFace(){
  const f = JA_FACES[jaFace] || JA_FACES.gothic;
  document.documentElement.style.setProperty("--ja-face", f.stack);
  document.documentElement.style.setProperty("--ja-size", f.px + "px");
}
function saveJaFace(){ try{ localStorage.setItem(JAFONT_KEY, jaFace); }catch(e){} }
function loadJaFace(){
  try{ const v = localStorage.getItem(JAFONT_KEY); if(v && JA_FACES[v]) jaFace = v; }catch(e){}
  applyJaFace();
  const sel = document.getElementById("opt-jafont");
  if(sel) sel.value = jaFace;
}
(function(){
  const wire = () => {
    const sel = document.getElementById("opt-jafont");
    if(!sel) return;
    sel.addEventListener("change", e => { jaFace = e.target.value; applyJaFace(); saveJaFace(); });
    loadJaFace();
  };
  if(document.readyState === "loading") document.addEventListener("DOMContentLoaded", wire);
  else wire();
})();
`;
  const last = html.lastIndexOf('</script>');
  html = html.slice(0, last) + js + html.slice(last);

  // 名前の食い違いは黙って落ちるので、ここで突き合わせておく
  for (const w of WEB) {
    const used = FACES.some(([, , stack]) => stack.includes(`"${w.css}"`));
    if (!used) throw new Error(`@font-face "${w.css}" を指す font-family がありません（名前の綴りを確認）`);
  }
  log(`  字体の切替: ${FACES.length} 種（同梱 ${(embedded / 1024 / 1024).toFixed(2)}MB）`);
  return html;
}

// 単体で走らせたとき用
if (import.meta.url === 'file:///' + process.argv[1].replace(/\\/g, '/')) {
  const f = process.argv[2] || 'build/index.html';
  fs.writeFileSync(f, addFontSwitcher(fs.readFileSync(f, 'utf8')));
  console.log('書き込み:', f);
}
