import { clavesDelCatalogo, entradaDe, TALLER_PARAMETROS_CATALOGO } from "./taller-parametros.catalogo";

describe("TALLER_PARAMETROS_CATALOGO", () => {
  it("todo requeridoSi apunta a una clave real del catálogo", () => {
    for (const clave of clavesDelCatalogo()) {
      const entrada = entradaDe(clave);
      if (entrada.requeridoSi) {
        expect(TALLER_PARAMETROS_CATALOGO).toHaveProperty([entrada.requeridoSi]);
      }
    }
  });

  it("requeridoSi siempre apunta a una clave booleana del MISMO ámbito", () => {
    for (const clave of clavesDelCatalogo()) {
      const entrada = entradaDe(clave);
      if (entrada.requeridoSi) {
        const gate = entradaDe(entrada.requeridoSi as any);
        expect(gate.tipo).toBe("boolean");
        expect(gate.ambito).toBe(entrada.ambito);
      }
    }
  });

  it("toda clave con comportamientoAnteFallo es booleana", () => {
    for (const clave of clavesDelCatalogo()) {
      const entrada = entradaDe(clave);
      if (entrada.comportamientoAnteFallo) {
        expect(entrada.tipo).toBe("boolean");
      }
    }
  });

  it("toda clave sensible es de tipo string (nunca boolean/number/json cifrado)", () => {
    for (const clave of clavesDelCatalogo()) {
      const entrada = entradaDe(clave);
      if (entrada.sensible) {
        expect(entrada.tipo).toBe("string");
      }
    }
  });

  it("las 4 claves de gating tienen comportamientoAnteFallo declarado", () => {
    const gates = [
      "facturacion.usa_facturacion",
      "tiendas.permite_crear",
      "productos.permite_crear",
      "notificaciones.usa_whatsapp",
    ] as const;
    for (const clave of gates) {
      expect(entradaDe(clave).comportamientoAnteFallo).toBeDefined();
    }
  });
});
