// Verifica la derivacion de tonos de marca contra los colores REALES que los
// negocios tienen guardados en la BD viva (no contra ejemplos inventados).
// Comprueba que todo texto que la tienda pinta con el color del negocio cumpla
// el contraste minimo AA, incluido el texto que va encima del color de marca.
//
//   node scripts/verificar_tema.ts
import { readFileSync } from 'node:fs';
import { variablesTema, contraste } from '../packages/shared/src/tema.ts';

const PROYECTO = 'szzhhlevtrcambcoytiz';
const MINIMO = 4.5;
const BLANCO: [number, number, number] = [255, 255, 255];

const token = readFileSync(new URL('../.sb_token', import.meta.url), 'utf8').trim();

const res = await fetch(`https://api.supabase.com/v1/projects/${PROYECTO}/database/query`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ query: 'select slug, color_primario from restaurantes order by slug' }),
});
const negocios = (await res.json()) as { slug: string; color_primario: string }[];
if (!Array.isArray(negocios)) throw new Error('No se pudo leer la BD: ' + JSON.stringify(negocios));

const rgbDe = (v: string): [number, number, number] =>
  v.split(' ').map(Number) as [number, number, number];

// Como se derivaban los tonos antes, para poder comparar la mejora.
function viejo(hex: string) {
  const h = hex.replace('#', '');
  const rgb = [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)) as [number, number, number];
  return {
    oscuro: rgb.map((v) => v * 0.82) as [number, number, number],
    claro: rgb.map((v) => v + (255 - v) * 0.9) as [number, number, number],
  };
}

let fallos = 0;
const check = (cond: boolean, msg: string) => {
  console.log((cond ? '  OK  ' : '  XX  ') + msg);
  if (!cond) fallos++;
};

// Colores reales de la BD + casos limite que un negocio puede elegir en el wizard.
const casos = [
  ...negocios.map((n) => [n.slug, n.color_primario] as const),
  ['(limite) amarillo puro', '#FFFF00'] as const,
  ['(limite) blanco', '#FFFFFF'] as const,
  ['(limite) negro', '#000000'] as const,
  ['(limite) lima', '#84CC16'] as const,
  ['(limite) cyan', '#22D3EE'] as const,
];

for (const [nombre, hex] of casos) {
  const v = variablesTema(hex);
  const base = rgbDe(v['--marca-rgb']);
  const oscuro = rgbDe(v['--marca-oscuro-rgb']);
  const claro = rgbDe(v['--marca-claro-rgb']);
  const sobreMarca = rgbDe(v['--marca-contraste-rgb']);
  const ant = viejo(hex);

  console.log(`\n${nombre}  ${hex}`);
  console.log(
    `      antes: texto ${contraste(ant.oscuro, BLANCO).toFixed(2)}:1 sobre blanco  ` +
      `| blanco sobre marca ${contraste(base, BLANCO).toFixed(2)}:1`,
  );
  console.log(
    `      ahora: texto ${contraste(oscuro, BLANCO).toFixed(2)}:1 sobre blanco  ` +
      `| contraste sobre marca ${contraste(base, sobreMarca).toFixed(2)}:1 ` +
      `(${sobreMarca[0] === 255 ? 'blanco' : 'negro'})`,
  );

  check(contraste(oscuro, BLANCO) >= MINIMO, `texto de marca legible sobre blanco (${nombre})`);
  check(contraste(base, sobreMarca) >= MINIMO, `texto legible encima del color de marca (${nombre})`);
  check(contraste(oscuro, claro) >= MINIMO, `texto de marca legible sobre el tinte claro (${nombre})`);
  check(contraste(claro, BLANCO) < 1.6, `el tinte claro sigue siendo un fondo suave (${nombre})`);
}

console.log(`\n${fallos === 0 ? 'TODO OK' : fallos + ' FALLOS'}`);
process.exit(fallos === 0 ? 0 : 1);
