// Dynamic import for cron to avoid issues in test environments
let CronJob: any = null;

try {
  const cronModule = require("cron");
  CronJob = cronModule.CronJob;
} catch (e) {
  console.warn("[ScheduledReports] Cron module not available");
}
import {
  generateLuckyAIReport,
  generateFraudAIReport,
  generateGameAIReport,
  generateSlotsAIReport,
  generateBingoAIReport,
  generatePokerAIReport,
  generateSportsAIReport,
  submitAIDutyReport,
  AIEmployeeRole,
} from "./aiEmployeeSystem.ts";

/**
 * Email notification service (mock - replace with actual email service)
 */
async function sendEmailNotification(
  to: string,
  subject: string,
  body: string
): Promise<boolean> {
  try {
    console.log(`[Email] To: ${to}`);
    console.log(`[Email] Subject: ${subject}`);
    console.log(`[Email] Body: ${body.substring(0, 100)}...`);
    // In production, integrate with SendGrid, AWS SES, or similar
    return true;
  } catch (error) {
    console.error("Failed to send email:", error);
    return false;
  }
}

/**
 * Generate all daily reports at 5 PM
 */
async function generateAllDailyReports(): Promise<void> {
  console.log("[ScheduledReports] Starting 5 PM daily report generation...");

  try {
    // Generate all reports in parallel
    const [luckyReport, fraudReport, gameReport, slotsReport, bingoReport, pokerReport, sportsReport] =
      await Promise.all([
        generateLuckyAIReport(),
        generateFraudAIReport(),
        generateGameAIReport(),
        generateSlotsAIReport(),
        generateBingoAIReport(),
        generatePokerAIReport(),
        generateSportsAIReport(),
      ]);

    // Submit duty reports
    await Promise.all([
      submitAIDutyReport(AIEmployeeRole.LUCKY_AI, 1, [], luckyReport),
      submitAIDutyReport(AIEmployeeRole.FRAUD_AI, 1, [], fraudReport),
      submitAIDutyReport(AIEmployeeRole.GAME_AI, 1, [], `Generated ${(gameReport as any).games?.length || 0} games`),
      submitAIDutyReport(AIEmployeeRole.SLOTS_AI, 1, [], slotsReport),
      submitAIDutyReport(AIEmployeeRole.BINGO_AI, 1, [], bingoReport),
      submitAIDutyReport(AIEmployeeRole.POKER_AI, 1, [], pokerReport),
      submitAIDutyReport(AIEmployeeRole.SPORTS_AI, 1, [], sportsReport),
    ]);

    // Send admin notification email
    const reportSummary = `
Daily AI Employee Reports Generated at 5 PM

LuckyAI (Coordinator): Report submitted
FraudAI (Fraud Detection): Report submitted
GameAI (Game Designer): ${(gameReport as any).games?.length || 0} new games created
SlotsAI (Slots Manager): Report submitted
BingoAI (Bingo Manager): Report submitted
PokerAI (Poker Manager): Report submitted
SportsAI (Sportsbook Manager): Report submitted

All reports are pending admin review and approval.
Visit /admin/duty-reports to review.
    `;

    await sendEmailNotification(
      "admin@playcoinkrazy.com",
      "Daily AI Employee Reports - 5 PM Submission",
      reportSummary
    );

    console.log("[ScheduledReports] Daily reports generated and submitted successfully");
  } catch (error) {
    console.error("[ScheduledReports] Error generating daily reports:", error);

    // Send error notification
    await sendEmailNotification(
      "admin@playcoinkrazy.com",
      "ERROR: Daily AI Employee Reports Failed",
      `Failed to generate daily reports at 5 PM. Error: ${error}`
    );
  }
}

/**
 * Initialize scheduled jobs
 */
export function initializeScheduledJobs(): void {
  // Schedule daily report generation at 5 PM (17:00)
  // Cron format: second minute hour day month day-of-week
  const dailyReportJob = new CronJob(
    "0 0 17 * * *", // 5 PM every day
    async () => {
      console.log("[ScheduledReports] Executing 5 PM daily report generation");
      await generateAllDailyReports();
    },
    null,
    true, // Start immediately
    "America/Chicago" // Timezone
  );

  console.log("[ScheduledReports] Scheduled jobs initialized");
  console.log("[ScheduledReports] Daily reports scheduled for 5 PM (17:00) Chicago time");

  // Optional: Schedule additional maintenance jobs
  const maintenanceJob = new CronJob(
    "0 0 2 * * *", // 2 AM every day
    async () => {
      console.log("[ScheduledReports] Running maintenance tasks");
      // Clean up old reports, archive data, etc.
    },
    null,
    true,
    "America/Chicago"
  );

  return;
}

/**
 * Get next scheduled report time
 */
export function getNextReportTime(): Date {
  const now = new Date();
  const nextReport = new Date(now);
  nextReport.setHours(17, 0, 0, 0); // 5 PM

  if (nextReport <= now) {
    nextReport.setDate(nextReport.getDate() + 1); // Tomorrow at 5 PM
  }

  return nextReport;
}

/**
 * Manually trigger report generation (for testing/admin)
 */
export async function manuallyTriggerReports(): Promise<{
  success: boolean;
  message: string;
  nextScheduledTime: Date;
}> {
  try {
    await generateAllDailyReports();
    return {
      success: true,
      message: "Reports generated successfully",
      nextScheduledTime: getNextReportTime(),
    };
  } catch (error) {
    return {
      success: false,
      message: `Failed to generate reports: ${error}`,
      nextScheduledTime: getNextReportTime(),
    };
  }
}
