// src/server/shared/cron/index.ts
// Cron jobs initialization and management

import cron from 'node-cron';
import { db } from '../db/client';
import { employees } from '../../features/personnel/db/employees.table';
import { eq, lt, isNull } from 'drizzle-orm';
import { getSoftDeleteTimestamp } from '../db/helpers';
import { logger } from '../lib/logger';
import { terminateUserSession } from '../plugins/socket';
import { dayjs } from '../lib/dayjs';
import { checkAndTriggerPersonalReminders } from '../../features/notes/lib/reminder-worker.service';

/**
 * Auto-logout cron job: Runs daily at 10:00 MSK
 * Terminates sessions for non-admin users created more than 2 hours ago
 */
function initializeAutoLogoutCron(): void {
  cron.schedule('0 10 * * *', async () => {
    try {
      logger.info('[Cron] Running Auto-logout cron job...');

      const twoHoursAgo = dayjs().subtract(2, 'hours').toDate();

      const usersToLogout = await db
        .select()
        .from(employees)
        .where(lt(employees.createdAt, twoHoursAgo));

      const nonAdminUsers = usersToLogout.filter((u) => u.role !== 'ADMIN');

      if (nonAdminUsers.length > 0) {
        logger.info(`[Cron] Terminating ${nonAdminUsers.length} user sessions...`);

        for (const user of nonAdminUsers) {
          terminateUserSession(user.id, 'Auto-logout: Session expired after 2 hours');

          await db
            .update(employees)
            .set({
              archivedAt: getSoftDeleteTimestamp(),
              updatedAt: new Date(),
            })
            .where(eq(employees.id, user.id));
        }
        logger.info(`[Cron] Auto-logout completed for ${nonAdminUsers.length} users`);
      } else {
        logger.info('[Cron] No users to logout');
      }
    } catch (error) {
      logger.error('[Cron] Error in Auto-logout cron job:', error);
    }
  }, {
    timezone: 'Europe/Moscow',
  });

  logger.info('[Cron] Auto-logout cron job scheduled for 10:00 MSK');
}

/**
 * Personal reminder worker cron job: Runs every minute
 * Checks for pending personal reminders and triggers notifications
 */
function initializeReminderWorkerCron(): void {
  cron.schedule('* * * * *', async () => {
    try {
      logger.info('[Cron] Running Personal reminder worker cron job...');
      await checkAndTriggerPersonalReminders();
    } catch (error) {
      logger.error('[Cron] Error in Personal reminder worker cron job:', error);
    }
  }, {
    timezone: 'Europe/Moscow',
  });

  logger.info('[Cron] Personal reminder worker cron job scheduled for every minute');
}

/**
 * Initialize all cron jobs
 * This function should be called after DB and plugins are initialized
 */
export function initializeCronJobs(): void {
  logger.info('[Cron] Initializing cron jobs...');

  // Auto-logout cron job
  initializeAutoLogoutCron();

  // Personal reminder worker cron job - runs every minute
  initializeReminderWorkerCron();

  logger.info('[Cron] All cron jobs initialized successfully');
}
