/**
 * Pasa outsidein por paginas de documentacion publicas, una a una y despacio.
 *
 * La idea: los enlaces muertos dentro de documentacion son el fallo que mas
 * tiempo ajeno cuesta y nadie los mide en conjunto. Comprobarlo en veinte sitios
 * conocidos da un dato que no existe publicado, y de paso prueba la herramienta
 * en superficies que no son las mias, que es lo unico que dice si sirve.
 *
 * Educacion antes que velocidad: un dominio cada vez, pausa entre dominios y
 * solo peticiones GET publicas — lo mismo que hace un lector con el ratón.
 *
 *   node tools/audit-docs.js data/sites.txt data/docs-audit.json
 */
const { execFileSync } = require('child_process');
const fs = require('fs');
const path = require('path');

const listFile = process.argv[2];
const outFile = process.argv[3] || path.join(__dirname, '..', 'data', 'docs-audit.json');
const tool = path.join(__dirname, '..', 'products', 'outsidein', 'outsidein.js');
const PAUSE_MS = 8000;

const sites = fs.readFileSync(listFile, 'utf8').split('\n')
  .map((s) => s.trim()).filter((s) => s && !s.startsWith('#'));

const results = fs.existsSync(outFile) ? JSON.parse(fs.readFileSync(outFile, 'utf8')) : {};
const sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);

for (const site of sites) {
  if (results[site]) { console.log('ya hecho:', site); continue; }
  let raw = '';
  try {
    raw = execFileSync(process.execPath, [tool, '--json', '--links', site],
      { encoding: 'utf8', env: { ...process.env, NO_COLOR: '1' }, maxBuffer: 40e6, timeout: 600000 });
  } catch (e) {
    // Codigo 1 significa "encontro algo roto", que es el caso interesante.
    raw = e.stdout || '';
  }
  let data;
  try { data = JSON.parse(raw); } catch { console.log('ilegible:', site); continue; }

  const fail = data.rows.filter((r) => r.level === 'FAIL');
  const warn = data.rows.filter((r) => r.level === 'WARN');
  results[site] = {
    checked: data.checked,
    fail: fail.map((r) => ({ url: r.url, status: r.status, note: r.note, from: r.from })),
    warn: warn.map((r) => ({ url: r.url, status: r.status, note: r.note })),
  };
  fs.writeFileSync(outFile, JSON.stringify(results, null, 2));
  console.log(`${site} -> ${data.checked} comprobadas, ${fail.length} rotas, ${warn.length} dudosas`);
  sleep(PAUSE_MS);
}

const all = Object.entries(results);
const withFail = all.filter(([, v]) => v.fail.length);
console.log(`\n${all.length} sitios · ${all.reduce((s, [, v]) => s + v.checked, 0)} comprobaciones · ` +
  `${withFail.length} con al menos un enlace roto · ` +
  `${all.reduce((s, [, v]) => s + v.fail.length, 0)} enlaces rotos en total`);
