// Steam の depot 情報から、インストールサイズとダウンロードサイズを調べる。
//
//   node steam-size.mjs            … Lowmoor (4977360)
//   node steam-size.mjs 4977360    … appid 指定
//
// **ゲームをダウンロードしない。** Steam が公開している app info を1回読むだけ。
// 無料ゲームでも steamcmd の匿名ログインでは実体を落とせないことが多いので、
// サイズを知りたいだけならこちらのほうが確実で速い。
//
// 出てくる数字の意味:
//   size     … インストール後にディスクを占める合計（Steam が「必要な空き容量」として出す値）
//   download … 転送量（depot は圧縮されて配られる）
//   buildid  … そのブランチの現在のビルド。更新されたか調べるならここを控えておく

const appid = process.argv[2] || '4977360';
const mib = (n) => (n / 1024 / 1024).toFixed(1);

const res = await fetch(`https://api.steamcmd.net/v1/info/${appid}`, {
  headers: { 'user-agent': 'lowmoor-size-probe' },
  signal: AbortSignal.timeout(30000),
});
if (!res.ok) throw new Error(`app info の取得に失敗: HTTP ${res.status}`);
const body = await res.json();
if (body.status !== 'success') throw new Error(`app info が success を返しませんでした: ${body.status}`);

const app = body.data?.[appid];
if (!app) throw new Error(`appid ${appid} のデータがありません`);

const name = app.common?.name ?? '(名前なし)';
const free = app.extended?.isfreeapp === '1';
console.log(`\n${name}  [appid ${appid}]${free ? '  ※基本プレイ無料' : ''}`);
console.log(`開発/販売: ${app.extended?.developer ?? '?'} / ${app.extended?.publisher ?? '?'}`);

const pub = app.depots?.branches?.public;
if (pub) {
  const t = Number(pub.timeupdated || pub.timebuildupdated || 0) * 1000;
  console.log(`ビルド: ${pub.buildid}` + (t ? `  更新: ${new Date(t).toISOString()}` : ''));
}

let totalSize = 0, totalDl = 0;
console.log('\nDepot                     インストール            ダウンロード');
console.log('─'.repeat(66));
for (const [id, depot] of Object.entries(app.depots ?? {})) {
  if (!/^\d+$/.test(id)) continue;                 // branches など数字でないキーを飛ばす
  const m = depot?.manifests?.public;
  if (!m || typeof m !== 'object') continue;
  const size = Number(m.size || 0), dl = Number(m.download || 0);
  totalSize += size; totalDl += dl;
  const label = (depot.name ? `${id} ${depot.name}` : id).slice(0, 24);
  console.log(`${label.padEnd(24)}  ${(size.toLocaleString() + ' B').padStart(18)}  ${(dl.toLocaleString() + ' B').padStart(18)}`);
}
console.log('─'.repeat(66));
console.log(`${'合計'.padEnd(23)}  ${(totalSize.toLocaleString() + ' B').padStart(18)}  ${(totalDl.toLocaleString() + ' B').padStart(18)}`);
console.log(`${''.padEnd(23)}  ${(mib(totalSize) + ' MiB').padStart(18)}  ${(mib(totalDl) + ' MiB').padStart(18)}\n`);
