export type EstadoDeclaracion = 'pendiente' | 'declarado' | 'acreditado';

export interface IvaMensual {
  id: number;
  año: number;
  mes: number;
  ivaTrasladado: number;
  ivaAcreditable: number;
  ivaRetenido: number;
  resultado: number;
  acumulado: number;
  estado: EstadoDeclaracion;
  fechaDeclaracion: string | null;
}

export interface IsrMensual {
  id: number;
  año: number;
  mes: number;
  ingresosAcumulados: number; // mensual — naming legacy, no se renombra en este spec
  deducciones: number;        // mensual
  baseGravable: number;       // mensual — sigue retornándose para no romper consumidores externos, pero ya no se muestra en la UI
  // Nuevos: running totals desde enero hasta el mes de esta fila
  ingresosAcum: number;
  deduccionesAcum: number;
  baseGravableAcum: number;   // sin clamp; puede ser negativo
  isrCausado: number;
  isrRetenido: number;
  isrAPagar: number;
  estado: EstadoDeclaracion;
  fechaDeclaracion: string | null;
}

export interface IvaRegimenDetalle {
  regimenClave: string;
  regimenDescripcion: string;
  monto: number;
}

export interface ResumenIva {
  trasladado: number;
  trasladadoPorRegimen: IvaRegimenDetalle[];
  acreditable: number;
  acreditablePorRegimen: IvaRegimenDetalle[];
  retenido: number;
  retenidoPorRegimen: IvaRegimenDetalle[];
  resultado: number;
  acumuladoAnual: number;
}

export interface IsrRegimenDetalle {
  regimenClave: string;
  regimenDescripcion: string;
  monto: number;
}

export interface BaseGravableRegimen {
  regimenClave: string;
  regimenDescripcion: string;
  ingresos: number;
  deducciones: number;
  baseGravable: number;
  isrCausado: number;
  formula: 'ingresos' | 'ingresos-deducciones';
}

export interface ResumenIsr {
  ingresosAcumulados: number;
  ingresosPorRegimen: IsrRegimenDetalle[];
  deducciones: number;
  deduccionesPorRegimen: IsrRegimenDetalle[];
  baseGravable: number;
  baseGravablePorRegimen: BaseGravableRegimen[];
  isrCausado: number;
  isrRetenido: number;
  isrAPagar: number;
}

/**
 * Desglose del cálculo provisional ISR del mes final del filtro:
 *   delPeriodo  = solo el mes final del filtro (1 mes)
 *   anteriores  = enero hasta el mes anterior al final (puede estar vacío)
 *   total       = enero hasta el mes final inclusive
 *
 * Reglas:
 * - delPeriodo + anteriores = total para campos aditivos (ingresos, deducciones, retenciones).
 * - Para baseGravable e isrCausado el total se calcula sobre el rango entero
 *   (no es la suma algebraica de delPeriodo + anteriores).
 * - baseGravable puede ser negativa en cualquiera de los tres rangos.
 * - isrCausado se clampa a 0 cuando la baseGravable acumulada es negativa.
 */
export interface ResumenIsrDesglosado {
  delPeriodo: ResumenIsr;
  anteriores: ResumenIsr;
  total: ResumenIsr;
  /** Mes final del filtro (1-12) */
  mesFinal: number;
  /** Año fiscal del filtro */
  anio: number;
}
