/**
 * Scheduler für das automatische BLZ-/Bankdaten-Update.
 *
 * Prüft täglich (03:30) sowie 90s nach Start, ob ein Update fällig ist:
 * Auto-Update aktiv UND (noch nie aktualisiert ODER letzte Aktualisierung
 * länger her als das eingestellte Intervall in Tagen). Trifft das zu, wird
 * der neueste Datensatz geladen (siehe blzData.service).
 *
 * Das eigentliche Intervall ist in den Einstellungen konfigurierbar
 * (`blzUpdateIntervalDays`); der Cron-Tick prüft nur die Fälligkeit.
 */
import cron from 'node-cron';
import { getSetting, getSettingBool } from './appSetting.service.js';
import { runUpdate } from './blzData.service.js';

async function maybeRun(): Promise<void> {
  const enabled = await getSettingBool('blzAutoUpdateEnabled');
  if (!enabled) {
    return;
  }

  const intervalDays = parseInt((await getSetting('blzUpdateIntervalDays')) || '30', 10) || 30;
  const lastUpdatedAt = await getSetting('blzLastUpdatedAt');

  if (lastUpdatedAt) {
    const last = new Date(lastUpdatedAt).getTime();
    if (!Number.isNaN(last)) {
      const ageDays = (Date.now() - last) / 86_400_000;
      if (ageDays < intervalDays) {
        return; // noch nicht fällig
      }
    }
  }

  console.log('[BLZ-Scheduler] Update fällig – prüfe auf neueren Datensatz…');
  await runUpdate(false);
}

export function startBlzUpdateScheduler(): void {
  // Täglich um 03:30 (Server-Zeit) Fälligkeit prüfen.
  cron.schedule('30 3 * * *', () => {
    maybeRun().catch((err) => console.error('[BLZ-Scheduler] Lauf fehlgeschlagen:', err));
  });

  // Catch-up 90s nach Start.
  setTimeout(() => {
    maybeRun().catch((err) => console.error('[BLZ-Scheduler] Catch-up fehlgeschlagen:', err));
  }, 90_000);

  console.log('[BLZ-Scheduler] Gestartet – tägliche Fälligkeitsprüfung + Catch-up nach 90s');
}
