import pool from '../db';
import { sendMonthlyPassExpiryEmail } from '../services/email';

const REMINDER_WINDOW_HOURS = 24;
const DEFAULT_SLEEP_MS = 60 * 60 * 1000;

export async function processMonthlyPassRenewalReminders(now: Date = new Date()): Promise<number> {
  const { rows } = await pool.query(
    `SELECT id, email, monthly_pass_expires
     FROM rm_users
     WHERE is_weatherman = TRUE
       AND monthly_pass_expires IS NOT NULL
       AND monthly_pass_expires > $1
       AND monthly_pass_expires <= $1 + ($2 || ' hours')::interval
       AND (
         monthly_pass_renewal_reminder_sent_at IS NULL
         OR monthly_pass_renewal_reminder_sent_at < monthly_pass_start
       )
     ORDER BY monthly_pass_expires ASC`,
    [now.toISOString(), String(REMINDER_WINDOW_HOURS)],
  );

  let sent = 0;
  for (const user of rows) {
    try {
      await sendMonthlyPassExpiryEmail(user.email, { expiresAt: user.monthly_pass_expires });
      await pool.query(
        `UPDATE rm_users
         SET monthly_pass_renewal_reminder_sent_at = NOW(),
             updated_at = NOW()
         WHERE id = $1`,
        [user.id],
      );
      sent++;
    } catch (err) {
      console.error(`[monthly-pass-reminders] Failed for ${user.id}:`, err);
    }
  }

  return sent;
}

let shuttingDown = false;
pool.on('error', (err) => {
  console.error('[monthly-pass-reminders] DB pool error:', err);
});

process.on('SIGTERM', () => { shuttingDown = true; });
process.on('SIGINT', () => { shuttingDown = true; });

async function main() {
  while (!shuttingDown) {
    try {
      const sent = await processMonthlyPassRenewalReminders();
      console.log(`[monthly-pass-reminders] Sent ${sent} reminder(s)`);
    } catch (err: any) {
      console.error('[monthly-pass-reminders] Cycle error:', err?.message || err);
    }

    if (shuttingDown) break;
    await new Promise((resolve) => setTimeout(resolve, DEFAULT_SLEEP_MS));
  }

  await pool.end().catch(() => {});
}

if (process.env.VITEST !== 'true') {
  main().catch((err) => {
    console.error('[monthly-pass-reminders] Fatal error:', err);
    process.exit(1);
  });
}
