import { startQuizExpiryCron } from './quizExpiry';
import { startNotificationCron } from './notificationScheduler';
import { startAutoCheckoutCron } from './autoCheckout';
import { startAttendanceSummaryCron } from './attendanceSummary';
import logger from '../utils/logger';

interface CronJob {
  name: string;
  envVar: string;
  start: () => void;
}

const CRON_JOBS: CronJob[] = [
  { name: 'Quiz expiry', envVar: 'CRON_QUIZ_EXPIRY_ENABLED', start: startQuizExpiryCron },
  { name: 'Notification scheduler', envVar: 'CRON_NOTIFICATIONS_ENABLED', start: startNotificationCron },
  { name: 'Auto-checkout', envVar: 'CRON_AUTO_CHECKOUT_ENABLED', start: startAutoCheckoutCron },
  { name: 'Attendance summary', envVar: 'CRON_ATTENDANCE_SUMMARY_ENABLED', start: startAttendanceSummaryCron },
];

const TRUE_VALUES = ['true', '1', 'yes', 'on'];
const FALSE_VALUES = ['false', '0', 'no', 'off'];

// Crons stay enabled unless explicitly turned off, so an unset variable keeps
// the existing behaviour. Unrecognised values fall back to enabled with a warning.
const isEnabled = (envVar: string): boolean => {
  const raw = process.env[envVar]?.trim().toLowerCase();
  if (!raw) return true;
  if (TRUE_VALUES.includes(raw)) return true;
  if (FALSE_VALUES.includes(raw)) return false;
  logger.warn(`[Cron] Unrecognised value for ${envVar}, defaulting to enabled`, {
    value: process.env[envVar],
  });
  return true;
};

export const startCronJobs = (): void => {
  for (const job of CRON_JOBS) {
    if (!isEnabled(job.envVar)) {
      logger.info(`[Cron] ${job.name}: DISABLED (${job.envVar})`);
      continue;
    }
    logger.info(`[Cron] ${job.name}: ENABLED (${job.envVar})`);
    job.start();
  }
};
