import axios from 'axios';

export interface ParsedApiError {
  /** Mensaje listo para mostrar al usuario. */
  message: string;
  /** True si el error es un bloqueo por período cerrado (codigo PERIODO_CERRADO_BLOQUEO_OPERACION). */
  isPeriodoCerrado: boolean;
  /** Código semántico del backend, si vino. */
  codigo?: string;
}

/**
 * Parsea el body de un error de Axios siguiendo los shapes que devuelve la API:
 *   - ExceptionHandlerMiddleware: { codigo, mensaje, idCierre?, fechaCorte? }  (period-cerrado)
 *   - Service tuple wrapped: { message }  (legacy, inglés)
 *   - Service tuple nuevo:   { mensaje }  (español)
 * Si nada matchea, devuelve el fallback recibido.
 */
export function parseApiError(err: unknown, fallback = 'Ocurrió un error inesperado.'): ParsedApiError {
  if (!axios.isAxiosError(err) || !err.response?.data) {
    return { message: fallback, isPeriodoCerrado: false };
  }

  const data = err.response.data as Record<string, unknown>;
  const codigo = typeof data.codigo === 'string' ? data.codigo : undefined;

  if (codigo === 'PERIODO_CERRADO_BLOQUEO_OPERACION') {
    const mensajeBackend = typeof data.mensaje === 'string' ? data.mensaje : '';
    const fechaCorteRaw = typeof data.fechaCorte === 'string' ? data.fechaCorte : '';
    const fechaFormateada = fechaCorteRaw
      ? new Date(fechaCorteRaw).toLocaleDateString('es-AR')
      : '';
    const fallbackPeriodo = fechaFormateada
      ? `El período está cerrado al ${fechaFormateada}. No se permiten modificaciones sobre fechas anteriores o iguales a la fecha de corte.`
      : 'El período está cerrado. No se permiten modificaciones sobre la fecha indicada.';
    return {
      message: mensajeBackend || fallbackPeriodo,
      isPeriodoCerrado: true,
      codigo,
    };
  }

  const mensaje =
    (typeof data.mensaje === 'string' && data.mensaje) ||
    (typeof data.message === 'string' && data.message) ||
    fallback;

  return { message: mensaje, isPeriodoCerrado: false, codigo };
}
