// 同梱フォントが「本当に読み込まれて、実際に使われているか」を確かめる。
//
// font-family に名前が入っているだけでは足りない。@font-face の名前と
// font-family の名前が一字でも違えば、黙ってシステムのフォントに落ちる。
// document.fonts.check も、フォールバックで描ければ true を返すのであてにならない。
//
// 確実なのは二つ:
//   1. document.fonts の各 FontFace を load() して status を見る
//   2. 欧文で字幅を測る（和文は全角で幅が揃うので差が出ない）
import fs from 'fs';
import { spawn } from 'child_process';

const CHROME = 'C:/Program Files/Google/Chrome/Application/chrome.exe';
const PORT = 9477, profile = 'C:/Users/ADMINI~1/AppData/Local/Temp/lm-fl';
fs.rmSync(profile, { recursive: true, force: true });
const chrome = spawn(CHROME, ['--headless=new', '--disable-gpu', '--no-sandbox', '--no-first-run',
  '--remote-debugging-port=' + PORT, '--user-data-dir=' + profile, '--window-size=1200,800', 'about:blank'], { stdio: 'ignore' });
const sleep = ms => new Promise(r => setTimeout(r, ms));
let list = null;
for (let i = 0; i < 40; i++) { try { list = await (await fetch(`http://127.0.0.1:${PORT}/json/list`)).json(); if (list.length) break; } catch { } await sleep(300); }
const ws = new WebSocket(list.find(t => t.type === 'page').webSocketDebuggerUrl);
await new Promise(r => ws.addEventListener('open', r));
let id = 0; const pend = new Map();
ws.addEventListener('message', e => { const m = JSON.parse(e.data); if (m.id && pend.has(m.id)) { pend.get(m.id)(m.result); pend.delete(m.id); } });
const send = (m, p = {}) => new Promise(res => { const i = ++id; pend.set(i, res); ws.send(JSON.stringify({ id: i, method: m, params: p })); });
const ev = async x => (await send('Runtime.evaluate', { expression: x, returnByValue: true, awaitPromise: true })).result?.value;

await send('Page.enable'); await send('Runtime.enable');
await send('Page.navigate', { url: 'file:///' + process.cwd().replace(/\\/g, '/') + '/build/index-app.html' });
await sleep(3500);

const r = await ev(`(async ()=>{
  const names = ['Zen Old Mincho','Klee One','DotGothic16'];
  // まず明示的に読み込ませる（未使用のフォントは unloaded のままなので）
  for (const n of names) { try { await document.fonts.load('12px "' + n + '"', 'あいう漢字ABC'); } catch(e){} }
  await document.fonts.ready;

  const probe = (fam, text) => {
    const c = document.createElement('canvas').getContext('2d');
    c.font = '12px ' + fam;
    return Math.round(c.measureText(text).width * 100) / 100;
  };
  const LAT = 'Hamburgefonstiv 0123';   // 欧文で測る。和文は全角で幅が揃ってしまう
  const base = probe('"__missing_xyz__"', LAT);

  const faces = {};
  for (const f of [...document.fonts]) faces[f.family] = f.status;

  const out = {};
  for (const n of names) {
    out[n] = {
      faceStatus: faces[n] || '(@font-face が無い)',
      latinWidth: probe('"' + n + '"', LAT),
      fallbackWidth: base,
      使われている: faces[n] === 'loaded' && probe('"' + n + '"', LAT) !== base,
    };
  }
  return out;
})()`);
console.log(JSON.stringify(r, null, 1));
const ok = Object.values(r).every(v => v['使われている']);
console.log(ok ? '\n=> 三書体とも読み込まれ、実際に使われています' : '\n=> 読み込まれていないものがあります');
ws.close(); chrome.kill();
process.exitCode = ok ? 0 : 1;
