import cron from 'node-cron';
import { processAllTenantsInvalidations } from '../services/metricas-compute.service.js';

// Corre cada 15 minutos en dev/test para iteración rápida; en prod puedes
// espaciarlo a 30-60 min si el volumen de cambios es bajo.
const METRICAS_CRON_SCHEDULE = '*/15 * * * *';

let scheduledTask: ReturnType<typeof cron.schedule> | null = null;
let running = false; // evita solapamiento si una corrida tarda más del intervalo

async function runProcessInvalidations(): Promise<void> {
  if (running) {
    console.log('[MetricasJob] Corrida previa aún en curso, skip');
    return;
  }
  running = true;
  const start = Date.now();
  try {
    const r = await processAllTenantsInvalidations();
    const elapsed = ((Date.now() - start) / 1000).toFixed(1);
    if (r.totalProcesadas > 0 || r.totalErrores > 0) {
      console.log(
        `[MetricasJob] ${r.tenantsRevisados} tenants, ${r.totalProcesadas} invalidaciones procesadas, ` +
        `${r.totalFilasEscritas} filas escritas, ${r.totalErrores} errores, ${elapsed}s`,
      );
    }
  } catch (err: any) {
    console.error('[MetricasJob] Error fatal:', err?.message || err);
  } finally {
    running = false;
  }
}

export function startMetricasInvalidationsJob(): void {
  if (scheduledTask) {
    console.log('[MetricasJob] Job ya iniciado');
    return;
  }
  scheduledTask = cron.schedule(METRICAS_CRON_SCHEDULE, runProcessInvalidations, {
    timezone: 'America/Mexico_City',
  });
  console.log(`[MetricasJob] Cron iniciado (${METRICAS_CRON_SCHEDULE})`);
}

export function stopMetricasInvalidationsJob(): void {
  if (scheduledTask) {
    scheduledTask.stop();
    scheduledTask = null;
  }
}

// Exportado para disparos manuales (ej. desde un endpoint admin)
export { runProcessInvalidations };
