/**
 * Email Warm-up Scheduler Service
 * Gradually increases sending volume for new domains to improve sender reputation
 */

export interface WarmupSchedule {
  day: number;
  dailyVolume: number;
  description: string;
}

export interface WarmupConfig {
  domain: string;
  startDate: Date;
  schedule: WarmupSchedule[];
  targetDailyVolume: number;
  enabled: boolean;
}

export interface WarmupStatus {
  domain: string;
  currentDay: number;
  currentDailyLimit: number;
  sentToday: number;
  remainingToday: number;
  progress: number; // 0-100
  isComplete: boolean;
  nextMilestone: WarmupSchedule | null;
}

/**
 * Get default warm-up schedule (30 days)
 */
export function getDefaultWarmupSchedule(): WarmupSchedule[] {
  return [
    { day: 1, dailyVolume: 50, description: 'Day 1: Start with 50 emails' },
    { day: 2, dailyVolume: 75, description: 'Day 2: Increase to 75 emails' },
    { day: 3, dailyVolume: 100, description: 'Day 3: Increase to 100 emails' },
    { day: 4, dailyVolume: 150, description: 'Day 4: Increase to 150 emails' },
    { day: 5, dailyVolume: 200, description: 'Day 5: Increase to 200 emails' },
    { day: 6, dailyVolume: 300, description: 'Day 6: Increase to 300 emails' },
    { day: 7, dailyVolume: 500, description: 'Day 7: Increase to 500 emails' },
    { day: 8, dailyVolume: 750, description: 'Day 8: Increase to 750 emails' },
    { day: 9, dailyVolume: 1000, description: 'Day 9: Increase to 1,000 emails' },
    { day: 10, dailyVolume: 1500, description: 'Day 10: Increase to 1,500 emails' },
    { day: 11, dailyVolume: 2000, description: 'Day 11: Increase to 2,000 emails' },
    { day: 12, dailyVolume: 3000, description: 'Day 12: Increase to 3,000 emails' },
    { day: 13, dailyVolume: 4000, description: 'Day 13: Increase to 4,000 emails' },
    { day: 14, dailyVolume: 5000, description: 'Day 14: Increase to 5,000 emails' },
    { day: 15, dailyVolume: 7500, description: 'Day 15: Increase to 7,500 emails' },
    { day: 16, dailyVolume: 10000, description: 'Day 16: Increase to 10,000 emails' },
    { day: 17, dailyVolume: 15000, description: 'Day 17: Increase to 15,000 emails' },
    { day: 18, dailyVolume: 20000, description: 'Day 18: Increase to 20,000 emails' },
    { day: 19, dailyVolume: 25000, description: 'Day 19: Increase to 25,000 emails' },
    { day: 20, dailyVolume: 30000, description: 'Day 20: Increase to 30,000 emails' },
    { day: 21, dailyVolume: 40000, description: 'Day 21: Increase to 40,000 emails' },
    { day: 22, dailyVolume: 50000, description: 'Day 22: Increase to 50,000 emails' },
    { day: 23, dailyVolume: 75000, description: 'Day 23: Increase to 75,000 emails' },
    { day: 24, dailyVolume: 100000, description: 'Day 24: Increase to 100,000 emails' },
    { day: 25, dailyVolume: 150000, description: 'Day 25: Increase to 150,000 emails' },
    { day: 26, dailyVolume: 200000, description: 'Day 26: Increase to 200,000 emails' },
    { day: 27, dailyVolume: 250000, description: 'Day 27: Increase to 250,000 emails' },
    { day: 28, dailyVolume: 300000, description: 'Day 28: Increase to 300,000 emails' },
    { day: 29, dailyVolume: 400000, description: 'Day 29: Increase to 400,000 emails' },
    { day: 30, dailyVolume: 500000, description: 'Day 30: Full capacity at 500,000 emails' },
  ];
}

/**
 * Get aggressive warm-up schedule (14 days)
 */
export function getAggressiveWarmupSchedule(): WarmupSchedule[] {
  return [
    { day: 1, dailyVolume: 100, description: 'Day 1: Start with 100 emails' },
    { day: 2, dailyVolume: 250, description: 'Day 2: Increase to 250 emails' },
    { day: 3, dailyVolume: 500, description: 'Day 3: Increase to 500 emails' },
    { day: 4, dailyVolume: 1000, description: 'Day 4: Increase to 1,000 emails' },
    { day: 5, dailyVolume: 2500, description: 'Day 5: Increase to 2,500 emails' },
    { day: 6, dailyVolume: 5000, description: 'Day 6: Increase to 5,000 emails' },
    { day: 7, dailyVolume: 10000, description: 'Day 7: Increase to 10,000 emails' },
    { day: 8, dailyVolume: 25000, description: 'Day 8: Increase to 25,000 emails' },
    { day: 9, dailyVolume: 50000, description: 'Day 9: Increase to 50,000 emails' },
    { day: 10, dailyVolume: 100000, description: 'Day 10: Increase to 100,000 emails' },
    { day: 11, dailyVolume: 200000, description: 'Day 11: Increase to 200,000 emails' },
    { day: 12, dailyVolume: 300000, description: 'Day 12: Increase to 300,000 emails' },
    { day: 13, dailyVolume: 400000, description: 'Day 13: Increase to 400,000 emails' },
    { day: 14, dailyVolume: 500000, description: 'Day 14: Full capacity at 500,000 emails' },
  ];
}

/**
 * Get conservative warm-up schedule (60 days)
 */
export function getConservativeWarmupSchedule(): WarmupSchedule[] {
  return [
    { day: 1, dailyVolume: 25, description: 'Day 1: Start with 25 emails' },
    { day: 2, dailyVolume: 50, description: 'Day 2: Increase to 50 emails' },
    { day: 3, dailyVolume: 75, description: 'Day 3: Increase to 75 emails' },
    { day: 4, dailyVolume: 100, description: 'Day 4: Increase to 100 emails' },
    { day: 5, dailyVolume: 150, description: 'Day 5: Increase to 150 emails' },
    { day: 6, dailyVolume: 200, description: 'Day 6: Increase to 200 emails' },
    { day: 7, dailyVolume: 300, description: 'Day 7: Increase to 300 emails' },
    { day: 8, dailyVolume: 400, description: 'Day 8: Increase to 400 emails' },
    { day: 9, dailyVolume: 500, description: 'Day 9: Increase to 500 emails' },
    { day: 10, dailyVolume: 750, description: 'Day 10: Increase to 750 emails' },
    { day: 15, dailyVolume: 1500, description: 'Day 15: Increase to 1,500 emails' },
    { day: 20, dailyVolume: 3000, description: 'Day 20: Increase to 3,000 emails' },
    { day: 25, dailyVolume: 5000, description: 'Day 25: Increase to 5,000 emails' },
    { day: 30, dailyVolume: 10000, description: 'Day 30: Increase to 10,000 emails' },
    { day: 40, dailyVolume: 50000, description: 'Day 40: Increase to 50,000 emails' },
    { day: 50, dailyVolume: 100000, description: 'Day 50: Increase to 100,000 emails' },
    { day: 60, dailyVolume: 500000, description: 'Day 60: Full capacity at 500,000 emails' },
  ];
}

/**
 * Calculate current warm-up status
 */
export function calculateWarmupStatus(config: WarmupConfig, sentToday: number): WarmupStatus {
  const now = new Date();
  const startDate = new Date(config.startDate);
  const daysPassed = Math.floor((now.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24));
  const currentDay = daysPassed + 1;

  // Find current schedule entry
  let currentSchedule = config.schedule[0];
  for (const schedule of config.schedule) {
    if (schedule.day <= currentDay) {
      currentSchedule = schedule;
    }
  }

  const isComplete = currentDay > config.schedule[config.schedule.length - 1].day;
  const progress = Math.min(100, (currentDay / config.schedule[config.schedule.length - 1].day) * 100);

  // Find next milestone
  let nextMilestone: WarmupSchedule | null = null;
  for (const schedule of config.schedule) {
    if (schedule.day > currentDay) {
      nextMilestone = schedule;
      break;
    }
  }

  return {
    domain: config.domain,
    currentDay,
    currentDailyLimit: currentSchedule.dailyVolume,
    sentToday,
    remainingToday: Math.max(0, currentSchedule.dailyVolume - sentToday),
    progress,
    isComplete,
    nextMilestone,
  };
}

/**
 * Check if email can be sent based on warm-up schedule
 */
export function canSendEmail(status: WarmupStatus): boolean {
  if (!status) return false;
  return status.remainingToday > 0;
}

/**
 * Get warm-up recommendations
 */
export function getWarmupRecommendations(status: WarmupStatus): string[] {
  const recommendations: string[] = [];

  if (status.sentToday === 0) {
    recommendations.push('No emails sent today. Consider sending some emails to maintain warm-up schedule.');
  }

  if (status.sentToday > status.currentDailyLimit) {
    recommendations.push(
      `You've exceeded today's warm-up limit (${status.currentDailyLimit}). Consider pausing sends to avoid damaging sender reputation.`
    );
  }

  if (status.remainingToday < status.currentDailyLimit * 0.2) {
    recommendations.push(`You're approaching today's limit. Only ${status.remainingToday} emails remaining.`);
  }

  if (status.nextMilestone) {
    recommendations.push(
      `Next milestone: ${status.nextMilestone.description} (in ${status.nextMilestone.day - status.currentDay} days)`
    );
  }

  if (status.isComplete) {
    recommendations.push('Warm-up period complete! You can now send at full capacity.');
  }

  return recommendations;
}

/**
 * Generate warm-up report
 */
export function generateWarmupReport(config: WarmupConfig, status: WarmupStatus): string {
  return `
Email Warm-up Report
====================

Domain: ${config.domain}
Current Day: ${status.currentDay}
Progress: ${status.progress.toFixed(1)}%

Daily Limits:
- Today's Limit: ${status.currentDailyLimit.toLocaleString()} emails
- Sent Today: ${status.sentToday.toLocaleString()} emails
- Remaining: ${status.remainingToday.toLocaleString()} emails

Status: ${status.isComplete ? 'COMPLETE' : 'IN PROGRESS'}

${
  status.nextMilestone
    ? `Next Milestone: ${status.nextMilestone.description}`
    : 'No more milestones - warm-up complete'
}
  `.trim();
}
