export type TipoDato = "boolean" | "string" | "number" | "json";
export type Ambito = "tenant" | "tienda";
export type ComportamientoAnteFallo = "bloquear" | "permitir";

export interface CatalogoEntrada {
  ambito: Ambito;
  tipo: TipoDato;
  grupo: string;
  etiqueta: string;
  descripcion: string;
  sensible: boolean;
  default?: boolean | string | number;
  // Clave de otra entrada del catalogo, MISMO ambito, cuyo valor booleano
  // en true hace que esta clave sea obligatoria. Ver spec §4.4.
  requeridoSi?: string;
  // Solo relevante para claves booleanas que gatean una accion. Ver spec §4.5.
  comportamientoAnteFallo?: ComportamientoAnteFallo;
}

export const TALLER_PARAMETROS_CATALOGO = {
  "facturacion.usa_facturacion": {
    ambito: "tenant", tipo: "boolean", default: true, grupo: "facturacion",
    etiqueta: "Usar facturación automática",
    descripcion: "Si está apagado, ninguna OT terminada intenta enviarse a POSTouch.",
    sensible: false, comportamientoAnteFallo: "bloquear",
  },
  "inventario.usa_validacion": {
    ambito: "tenant", tipo: "boolean", default: false, grupo: "inventario",
    etiqueta: "Validar existencias antes de facturar",
    descripcion: "Reservado — hoy no hay ninguna verificación de inventario en el código.",
    sensible: false,
  },
  "productos.permite_crear": {
    ambito: "tenant", tipo: "boolean", default: true, grupo: "productos",
    etiqueta: "Permitir crear productos desde el taller",
    descripcion: "Si está apagado, el catálogo local queda de solo lectura.",
    sensible: false, comportamientoAnteFallo: "permitir",
  },
  "tiendas.permite_crear": {
    ambito: "tenant", tipo: "boolean", default: true, grupo: "tiendas",
    etiqueta: "Permitir crear tiendas desde el taller",
    descripcion: "Para tenants sin ERP/POSTouch real detrás.",
    sensible: false, comportamientoAnteFallo: "bloquear",
  },
  "notificaciones.usa_whatsapp": {
    ambito: "tenant", tipo: "boolean", default: false, grupo: "notificaciones",
    etiqueta: "Enviar notificaciones por WhatsApp",
    descripcion: "Si está apagado, los demás campos de WhatsApp no se piden ni se muestran.",
    sensible: false, comportamientoAnteFallo: "bloquear",
  },
  "notificaciones.whatsapp_phone_number_id": {
    ambito: "tenant", tipo: "string", grupo: "notificaciones", sensible: false,
    etiqueta: "Phone Number ID", descripcion: "ID del número de WhatsApp Business en Meta.",
    requeridoSi: "notificaciones.usa_whatsapp",
  },
  "notificaciones.whatsapp_access_token": {
    ambito: "tenant", tipo: "string", grupo: "notificaciones", sensible: true,
    etiqueta: "Access Token", descripcion: "Token de acceso de la app de Meta. Se guarda cifrado.",
    requeridoSi: "notificaciones.usa_whatsapp",
  },
  "notificaciones.whatsapp_api_version": {
    ambito: "tenant", tipo: "string", grupo: "notificaciones", sensible: false, default: "v25.0",
    etiqueta: "Versión de API", descripcion: "Versión de Graph API de Meta a usar.",
  },
  "notificaciones.whatsapp_template_cotizacion": {
    ambito: "tenant", tipo: "string", grupo: "notificaciones", sensible: false,
    etiqueta: "Plantilla de cotización",
    descripcion: "Nombre de plantilla aprobada en Meta. Vacío = envía texto libre.",
  },
  "notificaciones.whatsapp_template_estado": {
    ambito: "tenant", tipo: "string", grupo: "notificaciones", sensible: false,
    etiqueta: "Plantilla de estado de OT",
    descripcion: "Nombre de plantilla aprobada en Meta. Vacío = envía texto libre.",
  },
  "notificaciones.whatsapp_template_language": {
    ambito: "tenant", tipo: "string", grupo: "notificaciones", sensible: false, default: "es_GT",
    etiqueta: "Idioma de plantilla", descripcion: "Código de idioma de las plantillas de Meta.",
  },
  "notificaciones.whatsapp_default_country_code": {
    ambito: "tenant", tipo: "string", grupo: "notificaciones", sensible: false, default: "502",
    etiqueta: "Código de país por defecto",
    descripcion: "Se antepone a números locales de 8 dígitos.",
  },
  "facturacion_pos.habilitada": {
    ambito: "tienda", tipo: "boolean", default: false, grupo: "facturacion",
    etiqueta: "Facturación POS habilitada",
    descripcion: "Envía automáticamente cada OT terminada de esta tienda a POSTouch.",
    sensible: false,
  },
  "facturacion_pos.url": {
    ambito: "tienda", tipo: "string", grupo: "facturacion", sensible: false,
    etiqueta: "URL de POSTouch", descripcion: "Endpoint create_ordenes_edngt de esta tienda.",
    requeridoSi: "facturacion_pos.habilitada",
  },
  "facturacion_pos.username": {
    ambito: "tienda", tipo: "string", grupo: "facturacion", sensible: false,
    etiqueta: "Usuario de servicio", descripcion: "Usuario de POSTouch para esta tienda.",
    requeridoSi: "facturacion_pos.habilitada",
  },
  "facturacion_pos.password": {
    ambito: "tienda", tipo: "string", grupo: "facturacion", sensible: true,
    etiqueta: "Contraseña de servicio", descripcion: "Se guarda cifrada. Vacío al guardar = no cambiar.",
    requeridoSi: "facturacion_pos.habilitada",
  },
  "facturacion_pos.computadora": {
    ambito: "tienda", tipo: "string", grupo: "facturacion", sensible: false,
    etiqueta: "Computadora", descripcion: "Identificador de tienda/caja en POSTouch.",
    requeridoSi: "facturacion_pos.habilitada",
  },
  "facturacion_pos.precio_decimales": {
    ambito: "tienda", tipo: "number", grupo: "facturacion", sensible: false,
    etiqueta: "Decimales de precio",
    descripcion: "Decimales de redondeo configurados en POSTouch para esta tienda (ParametrosGlobales).",
    requeridoSi: "facturacion_pos.habilitada",
  },
} as const satisfies Record<string, CatalogoEntrada>;

export type TallerParametroClave = keyof typeof TALLER_PARAMETROS_CATALOGO;

type TipoTS<T extends TipoDato> = T extends "boolean"
  ? boolean
  : T extends "number"
    ? number
    : T extends "json"
      ? Record<string, unknown>
      : string;

export type ValorDe<K extends TallerParametroClave> = TipoTS<(typeof TALLER_PARAMETROS_CATALOGO)[K]["tipo"]>;

export function entradaDe(clave: TallerParametroClave): CatalogoEntrada {
  return TALLER_PARAMETROS_CATALOGO[clave];
}

export function clavesDelCatalogo(): TallerParametroClave[] {
  return Object.keys(TALLER_PARAMETROS_CATALOGO) as TallerParametroClave[];
}

export function clavesPorAmbito(ambito: Ambito): TallerParametroClave[] {
  return clavesDelCatalogo().filter((c) => TALLER_PARAMETROS_CATALOGO[c].ambito === ambito);
}
