/**
 * Traduce errores crudos de los proveedores de IA (Anthropic / OpenAI) a mensajes claros
 * en español para el usuario final. Evita volcar el JSON/stack crudo del proveedor y
 * distingue las causas más comunes (sin saldo, key inválida, límite, modelo incompatible…).
 */

/**
 * Detecta el error de OpenAI cuando un modelo viejo NO acepta `max_completion_tokens`
 * (para reintentar con `max_tokens`). No confundir con el caso inverso, que ya evitamos
 * usando `max_completion_tokens` como parámetro por defecto.
 */
export function esErrorParametroTokens(err: unknown): boolean {
  const msg = extraerMensajeError(err).toLowerCase();
  return (
    msg.includes('max_completion_tokens') &&
    (msg.includes('unsupported') ||
      msg.includes('not supported') ||
      msg.includes('unknown') ||
      msg.includes('unrecognized'))
  );
}

/** Extrae el mensaje real del error, sin importar cómo lo anide cada SDK. */
export function extraerMensajeError(err: unknown): string {
  const e = err as any;
  return (
    e?.error?.error?.message || // Anthropic SDK (envuelto)
    e?.error?.message || // OpenAI SDK
    e?.message ||
    (typeof err === 'string' ? err : JSON.stringify(err))
  );
}

/** Mapea el texto crudo del error a un mensaje entendible. `proveedor` mejora la redacción. */
export function mensajeAmigableIA(raw = '', proveedor?: string): string {
  const r = String(raw).toLowerCase();
  const prov = proveedor === 'openai' ? 'OpenAI' : proveedor === 'anthropic' ? 'Anthropic' : 'de IA';

  // Sin saldo / facturación (Anthropic "credit balance too low", OpenAI "insufficient_quota").
  if (
    r.includes('credit balance') ||
    r.includes('too low') ||
    r.includes('insufficient_quota') ||
    r.includes('exceeded your current quota') ||
    r.includes('billing')
  )
    return `La cuenta de ${prov} no tiene saldo/créditos disponibles. Recargá créditos en el panel de facturación del proveedor y volvé a intentar.`;

  // API key inválida / autenticación (401).
  if (
    r.includes('invalid api key') ||
    r.includes('incorrect api key') ||
    r.includes('invalid_api_key') ||
    r.includes('authentication') ||
    r.includes('unauthorized') ||
    r.includes('401')
  )
    return `La API key de ${prov} es inválida o expiró. Verificá la clave en Configuración de IA.`;

  // Límite de tasa (429).
  if (r.includes('rate limit') || r.includes('too many requests') || r.includes('429'))
    return `Se alcanzó el límite de solicitudes de ${prov}. Esperá unos segundos e intentá de nuevo.`;

  // Modelo inexistente / sin acceso.
  if (r.includes('model') && (r.includes('not found') || r.includes('does not exist') || r.includes('no such model')))
    return `El modelo configurado no existe o no está disponible en tu cuenta de ${prov}. Revisá el modelo en Configuración de IA.`;

  // Parámetro/modelo incompatible (ej. max_tokens vs max_completion_tokens).
  if (r.includes('unsupported parameter') || r.includes('max_completion_tokens') || r.includes('not supported with this model'))
    return `El modelo configurado no es compatible con la configuración actual. Probá con otro modelo en Configuración de IA.`;

  // Permisos.
  if (r.includes('permission') || r.includes('forbidden') || r.includes('403'))
    return `Tu cuenta de ${prov} no tiene acceso a este modelo o recurso.`;

  // Red / conectividad.
  if (
    r.includes('timeout') ||
    r.includes('network') ||
    r.includes('econnrefused') ||
    r.includes('enotfound') ||
    r.includes('fetch failed')
  )
    return `No se pudo conectar con el servidor de ${prov}. Revisá tu conexión e intentá de nuevo.`;

  return `No se pudo completar la solicitud con ${prov}. Intentá de nuevo; si el problema persiste, revisá la configuración de IA.`;
}
