/**
 * Extensión periódica de recordatorios recurrentes.
 *
 * Cada vez que corre, itera los tenants activos y para cada serie periódica
 * activa genera nuevas instancias futuras hasta mantener un horizonte mínimo
 * (default 24 meses).
 *
 * Programado diariamente a las 6:00 AM (America/Mexico_City) porque es una
 * tarea liviana y nos asegura que siempre haya instancias disponibles.
 */
import cron from 'node-cron';
import { prisma, tenantDb } from '../config/database.js';
import { extenderSeriesActivas } from '../services/recordatorios.service.js';

const SCHEDULE = '0 6 * * *'; // 06:00 AM diario

let task: ReturnType<typeof cron.schedule> | null = null;

export async function runRecordatoriosPeriodicosJob(): Promise<{
  tenants: number;
  series: number;
  instancias: number;
}> {
  const tenants = await prisma.tenant.findMany({
    where: { active: true },
    select: { id: true, rfc: true, databaseName: true },
  });

  let seriesTotal = 0;
  let instanciasTotal = 0;

  for (const tenant of tenants) {
    if (!tenant.databaseName) continue;
    try {
      const pool = await tenantDb.getPool(tenant.id, tenant.databaseName);
      const result = await extenderSeriesActivas(pool);
      if (result.series > 0) {
        console.log(`[Recordatorios Periodicos] ${tenant.rfc}: ${result.instancias} instancias en ${result.series} series`);
      }
      seriesTotal += result.series;
      instanciasTotal += result.instancias;
    } catch (err: any) {
      console.error(`[Recordatorios Periodicos] Error en ${tenant.rfc}:`, err.message || err);
    }
  }

  return { tenants: tenants.length, series: seriesTotal, instancias: instanciasTotal };
}

export function startRecordatoriosPeriodicosJob(): void {
  if (task) {
    console.warn('[Recordatorios Periodicos Cron] Ya iniciado');
    return;
  }
  task = cron.schedule(SCHEDULE, async () => {
    try {
      const result = await runRecordatoriosPeriodicosJob();
      if (result.series > 0) {
        console.log(`[Recordatorios Periodicos Cron] ${result.tenants} tenants — ${result.instancias} instancias en ${result.series} series`);
      }
    } catch (err: any) {
      console.error('[Recordatorios Periodicos Cron] Error general:', err.message || err);
    }
  }, {
    timezone: 'America/Mexico_City',
  });
  console.log(`[Recordatorios Periodicos Cron] Programado: ${SCHEDULE} (06:00 AM diario America/Mexico_City)`);
}

export function stopRecordatoriosPeriodicosJob(): void {
  if (task) {
    task.stop();
    task = null;
  }
}
