// Catálogo de eventos fiscales
export const EVENTOS_FISCALES = [
  {
    titulo: 'Declaración mensual ISR',
    tipo: 'declaracion',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: false,
    regimenes: 'todos',
    condicion: null,
  },
  {
    titulo: 'Declaración mensual IVA',
    tipo: 'declaracion',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: false,
    regimenes: 'todos',
    condicion: null,
  },
  {
    titulo: 'Declaración mensual IEPS',
    tipo: 'declaracion',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: false,
    regimenes: 'todos',
    condicion: null,
  },
  {
    titulo: 'Declaración de sueldos y salarios',
    tipo: 'declaracion',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: false,
    regimenes: 'todos',
    condicion: 'tiene_nomina',
  },
  {
    titulo: 'Pago provisional ISR',
    tipo: 'pago',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: true,
    regimenes: 'todos',
    condicion: null,
  },
  {
    titulo: 'Pago provisional IVA',
    tipo: 'pago',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: true,
    regimenes: 'todos',
    condicion: null,
  },
  {
    titulo: 'Pago provisional IEPS',
    tipo: 'pago',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: true,
    regimenes: 'todos',
    condicion: null,
  },
  {
    titulo: 'DIOT',
    tipo: 'obligacion',
    diaBase: 17,
    mesRelativo: 1,
    recurrencia: 'mensual',
    usaExtensionRfc: false,
    regimenes: '601,603,607,608,610,611,612,614,615,620,622,623,624',
    condicion: null, // 612 aplica condición ingresos_4m, se valida en runtime
  },
  {
    titulo: 'Contabilidad electrónica',
    tipo: 'obligacion',
    diaBase: 3,
    mesRelativo: 2,
    recurrencia: 'mensual',
    usaExtensionRfc: false,
    regimenes: '601,603,607,608,610,611,612,614,615,620,622,623,624',
    condicion: null,
  },
  {
    titulo: 'Declaración anual PM',
    tipo: 'declaracion',
    diaBase: 31,
    mesRelativo: 0,
    mesFijo: 3,
    recurrencia: 'anual',
    usaExtensionRfc: false,
    regimenes: '601,603,620,622,623,624',
    condicion: null,
  },
  {
    titulo: 'Declaración anual PF',
    tipo: 'declaracion',
    diaBase: 30,
    mesRelativo: 0,
    mesFijo: 4,
    recurrencia: 'anual',
    usaExtensionRfc: false,
    regimenes: '605,606,607,608,611,612,614,615,621,625,626',
    condicion: null,
  },
  {
    titulo: 'Informativa Sueldos y Salarios',
    tipo: 'informativa',
    diaBase: 15,
    mesRelativo: 0,
    mesFijo: 2,
    recurrencia: 'anual',
    usaExtensionRfc: false,
    regimenes: 'todos',
    condicion: 'tiene_nomina',
  },
];

// Días festivos oficiales de México (2020-2027)
// Incluye: 1 ene, 5 feb, 21 mar, 1 may, 16 sep, 1 oct (cambio poder), 20 nov, 25 dic
// + cambios de poder cada 6 años, semana santa variable
export const DIAS_INHABILES: { fecha: string; nombre: string }[] = [];

function addFestivos(año: number) {
  const fijos = [
    { mes: 1, dia: 1, nombre: 'Año Nuevo' },
    { mes: 5, dia: 1, nombre: 'Día del Trabajo' },
    { mes: 9, dia: 16, nombre: 'Independencia de México' },
    { mes: 12, dia: 25, nombre: 'Navidad' },
  ];

  // Primer lunes de febrero (Constitución)
  const feb1 = new Date(año, 1, 1);
  const primerLunesFeb = new Date(año, 1, 1 + ((8 - feb1.getDay()) % 7));
  DIAS_INHABILES.push({
    fecha: primerLunesFeb.toISOString().split('T')[0],
    nombre: 'Día de la Constitución',
  });

  // Tercer lunes de marzo (Benito Juárez)
  const mar1 = new Date(año, 2, 1);
  const primerLunesMar = new Date(año, 2, 1 + ((8 - mar1.getDay()) % 7));
  const tercerLunesMar = new Date(primerLunesMar);
  tercerLunesMar.setDate(tercerLunesMar.getDate() + 14);
  DIAS_INHABILES.push({
    fecha: tercerLunesMar.toISOString().split('T')[0],
    nombre: 'Natalicio de Benito Juárez',
  });

  // Tercer lunes de noviembre (Revolución)
  const nov1 = new Date(año, 10, 1);
  const primerLunesNov = new Date(año, 10, 1 + ((8 - nov1.getDay()) % 7));
  const tercerLunesNov = new Date(primerLunesNov);
  tercerLunesNov.setDate(tercerLunesNov.getDate() + 14);
  DIAS_INHABILES.push({
    fecha: tercerLunesNov.toISOString().split('T')[0],
    nombre: 'Día de la Revolución',
  });

  for (const f of fijos) {
    DIAS_INHABILES.push({
      fecha: `${año}-${String(f.mes).padStart(2, '0')}-${String(f.dia).padStart(2, '0')}`,
      nombre: f.nombre,
    });
  }

  // Cambio de poder (1 oct cada 6 años: 2024, 2030...)
  if (año % 6 === 0 || (año - 2024) % 6 === 0) {
    DIAS_INHABILES.push({
      fecha: `${año}-10-01`,
      nombre: 'Transmisión del Poder Ejecutivo Federal',
    });
  }
}

for (let y = 2020; y <= 2027; y++) addFestivos(y);
