import { BadRequestException } from '@nestjs/common';

/**
 * Configuración operativa editable desde el reporte del superadmin (plan §9.3).
 * Solo claves de la lista y valores con forma validada: la tabla config nunca
 * guarda secretos ni texto libre.
 */
export const CLAVES_EDITABLES = [
  'ia_activa',
  'tope_tokens_diarios',
  'youtrack_activo',
  'modelo_redactor',
  'modelo_extractor',
  'modelo_consultor',
  'modelo_manual',
  'modelo_capturas',
  'telefono_contacto',
] as const;
export type ClaveEditable = (typeof CLAVES_EDITABLES)[number];

/** Un modelo que no existe rompe las respuestas al instante: solo ids de Claude con forma válida. */
const MODELO = /^claude-[a-z0-9][a-z0-9.-]{2,50}$/;
const TELEFONO = /^\+?[0-9][0-9 ()./-]{5,28}$/;

/** Solo ia_activa y tope_tokens_diarios tienen versión por empresa; el resto es del servicio. */
export function validarConfig(clave: ClaveEditable, ambito: string, valor: string): string {
  if (ambito !== 'global' && clave !== 'ia_activa' && clave !== 'tope_tokens_diarios') {
    throw new BadRequestException(`${clave} solo tiene ámbito global.`);
  }
  if (clave === 'ia_activa' || clave === 'youtrack_activo') {
    const v = valor.trim().toLowerCase();
    if (v !== 'true' && v !== 'false') throw new BadRequestException(`${clave} solo acepta true o false.`);
    return v;
  }
  if (clave === 'tope_tokens_diarios') {
    const n = Number(valor.trim());
    if (!Number.isInteger(n) || n < 10_000 || n > 100_000_000) {
      throw new BadRequestException('tope_tokens_diarios tiene que ser un entero entre 10.000 y 100.000.000.');
    }
    return String(n);
  }
  if (clave === 'telefono_contacto') {
    const v = valor.trim();
    if (!TELEFONO.test(v)) throw new BadRequestException('El teléfono tiene que ser un número de contacto válido.');
    return v;
  }
  const v = valor.trim().toLowerCase();
  if (!MODELO.test(v)) {
    throw new BadRequestException('El modelo tiene que ser un id de Claude (por ejemplo claude-haiku-5-5).');
  }
  return v;
}
