#!/usr/bin/env node
/**
 * Vypíše prohlížeče, ze kterých si uživatel může vybrat, a označí, co má v systému.
 *   node scripts/prohlizece.mjs            → čitelný výpis pro člověka
 *   node scripts/prohlizece.mjs --json     → strojově, pro Clauda
 *
 * Claude z toho složí nabídku a zapíše volbu:
 *   node scripts/prohlizece.mjs --nastav chrome
 */
import { spawn } from 'node:child_process';
import {
  PROHLIZECE, jeNainstalovan, nactiNastaveni, ulozProhlizec,
  SOUBOR_NASTAVENI, KOREN_SKILLU, otevriProhlizec
} from './lib/spolecne.mjs';

const argv = process.argv.slice(2);

/** Stáhne motor prohlížeče přes Playwright. */
function stahniMotor(engine) {
  return new Promise((resolve) => {
    const cely = `npx playwright install ${engine}`;
    console.log(`\n▸ Stahuji ${engine} (jednorázově)\n  ${cely}`);
    try {
      // Shell je na Windows nutný (npx je .cmd); příkaz předáváme jako jeden
      // string bez pole argumentů, ať Node nehlásí DEP0190.
      const p = spawn(cely, { cwd: KOREN_SKILLU, stdio: 'inherit', shell: true });
      p.on('close', (kod) => resolve(kod === 0));
      p.on('error', (e) => { console.error('  ' + e.message); resolve(false); });
    } catch (e) { console.error('  ' + e.message); resolve(false); }
  });
}

/** Jde ten prohlížeč vážně spustit? Otevře ho na skrytě a hned zavře. */
async function jdeSpustit(klic) {
  try {
    const ctx = await otevriProhlizec({ viditelny: false, prohlizec: klic });
    await ctx.close().catch(() => {});
    return true;
  } catch (e) { return false; }
}

/* Nastavení volby */
const iNastav = argv.indexOf('--nastav');
if (iNastav >= 0) {
  const klic = (argv[iNastav + 1] || '').toLowerCase();
  try {
    ulozProhlizec(klic);
  } catch (e) {
    console.error('CHYBA: ' + e.message);
    process.exit(1);
  }
  console.log(`NASTAVENO:${klic}  (${PROHLIZECE[klic].nazev})`);
  console.log(`Uloženo do ${SOUBOR_NASTAVENI}`);

  // Ověř, že to jde spustit. Když ne a je to stahovaný prohlížeč, stáhni ho.
  if (!(await jdeSpustit(klic))) {
    if (PROHLIZECE[klic].stahovat) {
      const ok = await stahniMotor(PROHLIZECE[klic].engine);
      if (!ok || !(await jdeSpustit(klic))) {
        console.error(`\nCHYBA: ${PROHLIZECE[klic].nazev} se nepodařilo připravit.`);
        console.error('Vyber jiný prohlížeč, nebo zkontroluj připojení k internetu.');
        process.exit(1);
      }
    } else {
      console.error(`\nCHYBA: ${PROHLIZECE[klic].nazev} v systému nenajdu.`);
      console.error('Nainstaluj ho, nebo vyber jiný: node scripts/prohlizece.mjs');
      process.exit(1);
    }
  }
  console.log('OVERENO: prohlížeč se spustil, můžeme pokračovat na přihlášení.');
  process.exit(0);
}

/* Výpis */
const zvoleny = nactiNastaveni().prohlizec || null;
const seznam = Object.entries(PROHLIZECE).map(([klic, v]) => ({
  klic,
  nazev: v.nazev,
  // U stahovaných prohlížečů nemá smysl hlídat systémovou instalaci — Playwright
  // si je stáhne sám. U Chrome/Edge se koukáme, jestli na disku jsou.
  vSystemu: v.stahovat ? null : jeNainstalovan(klic),
  stahuje_playwright: v.stahovat,
  zvoleny: klic === zvoleny
}));

if (argv.includes('--json')) {
  console.log(JSON.stringify({ zvoleny, prohlizece: seznam }, null, 2));
  process.exit(0);
}

console.log('=== Prohlížeče pro generování obrázků ===\n');
for (const p of seznam) {
  const stav = p.stahuje_playwright
    ? 'stáhne si ho Playwright'
    : (p.vSystemu ? 'nainstalovaný' : 'nenalezený');
  const znacka = p.zvoleny ? ' ← zvolený' : '';
  console.log(`  ${p.klic.padEnd(9)} ${p.nazev.padEnd(16)} ${stav}${znacka}`);
}
console.log('\nVýběr:  node scripts/prohlizece.mjs --nastav chrome');
if (!zvoleny) console.log('Zatím nic nezvoleno — použije se Chrome, Edge, nebo Chromium (v tomhle pořadí).');
