// 4つの語彙表の鍵をつき合わせ、どちらか片方にしか無い鍵を探す。
// 片方に無ければ、その言い回しを選んでいるときだけ内部語が素で出る。
import fs from 'fs';
const src = fs.readFileSync(process.argv[2] || 'app/game/index.html', 'utf8');

function body(name) {
  const i = src.indexOf('const ' + name + ' = {');
  if (i < 0) return null;
  let d = 0, j = i, st = false;
  for (; j < src.length; j++) {
    const c = src[j];
    if (c === '{') { d++; st = true; }
    else if (c === '}') { d--; if (st && d === 0) { j++; break; } }
  }
  return src.slice(i, j);
}
function keys(name) {
  const b = body(name);
  if (b == null) return null;
  return [...b.matchAll(/[\n{,]\s*([A-Za-z_$][\w$]*)\s*:\s*(?:\(|function)/g)].map(m => m[1]);
}

const T = {};
for (const n of ['MECH_ADD', 'MECH_MULT', 'WORLD_ADD', 'WORLD_MULT']) {
  T[n] = keys(n);
  console.log(n.padEnd(11), T[n] ? T[n].length + ' 鍵' : '見つからず');
}
const mech = new Set([...(T.MECH_ADD || []), ...(T.MECH_MULT || [])]);
const world = new Set([...(T.WORLD_ADD || []), ...(T.WORLD_MULT || [])]);
console.log('\nMECH のみ:', [...mech].filter(k => !world.has(k)).join(' ') || 'なし');
console.log('WORLD のみ:', [...world].filter(k => !mech.has(k)).join(' ') || 'なし');

// 実際に渡される鍵
const used = new Set();
for (const m of src.matchAll(/mechLine\(\s*"([\w$]+)"/g)) used.add(m[1]);
for (const m of src.matchAll(/\b(?:add|mult)\s*:\s*\{([^{}]*)\}/g))
  for (const k of m[1].matchAll(/([A-Za-z_$][\w$]*)\s*:/g)) used.add(k[1]);
console.log('\n渡される鍵:', used.size, '種');
console.log('MECH に無い:', [...used].filter(k => !mech.has(k)).sort().join(' ') || 'なし');
console.log('WORLD に無い:', [...used].filter(k => !world.has(k)).sort().join(' ') || 'なし');
