import { getDb } from "../db.ts";
import { invokeLLM } from "../_core/llm.ts";

export interface EmailCampaign {
  id: string;
  name: string;
  subject: string;
  template: "vip_promotion" | "tournament_announcement" | "win_notification" | "daily_bonus" | "custom";
  content: string;
  targetSegment: "all" | "vip" | "active_players" | "inactive_players" | "high_spenders";
  scheduledTime?: Date;
  status: "draft" | "scheduled" | "sent" | "failed";
  recipientCount: number;
  sentCount: number;
  openRate: number;
  clickRate: number;
  createdAt: Date;
  updatedAt: Date;
}

export interface EmailTemplate {
  id: string;
  name: string;
  subject: string;
  htmlContent: string;
  textContent: string;
  variables: string[];
}

const EMAIL_TEMPLATES: Record<string, EmailTemplate> = {
  vip_promotion: {
    id: "vip_promotion",
    name: "VIP Tier Promotion",
    subject: "🎖️ Congratulations! You've Been Promoted to {{tier}} VIP",
    htmlContent: `
      <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
        <h1 style="color: #3b82f6;">Welcome to {{tier}} VIP!</h1>
        <p>Dear {{playerName}},</p>
        <p>We're thrilled to announce that you've been promoted to our exclusive {{tier}} VIP tier!</p>
        <h2 style="color: #3b82f6;">Your New Benefits:</h2>
        <ul>
          <li>{{bonus}}% Bonus on all deposits</li>
          <li>{{cashback}}% Cashback on losses</li>
          <li>{{freeSpins}} Free Spins daily</li>
          <li>Exclusive VIP tournaments with higher prizes</li>
          <li>Dedicated VIP support team</li>
        </ul>
        <p><a href="{{loginUrl}}" style="background-color: #3b82f6; color: black; padding: 10px 20px; text-decoration: none; border-radius: 5px; display: inline-block;">Claim Your Benefits</a></p>
        <p>Best regards,<br/>The CoinKrazy Team</p>
      </div>
    `,
    textContent: "Welcome to {{tier}} VIP! Enjoy {{bonus}}% bonus, {{cashback}}% cashback, and {{freeSpins}} free spins daily.",
    variables: ["tier", "playerName", "bonus", "cashback", "freeSpins", "loginUrl"],
  },
  tournament_announcement: {
    id: "tournament_announcement",
    name: "Tournament Announcement",
    subject: "🏆 {{tournamentName}} - {{prizePool}} Prize Pool!",
    htmlContent: `
      <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
        <h1 style="color: #3b82f6;">{{tournamentName}}</h1>
        <p>Dear {{playerName}},</p>
        <p>Join our exciting new tournament with a {{prizePool}} prize pool!</p>
        <h2>Tournament Details:</h2>
        <ul>
          <li>Start Date: {{startDate}}</li>
          <li>End Date: {{endDate}}</li>
          <li>Prize Pool: {{prizePool}}</li>
          <li>Max Players: {{maxPlayers}}</li>
          <li>Entry Fee: {{entryFee}}</li>
        </ul>
        <p><a href="{{tournamentUrl}}" style="background-color: #3b82f6; color: black; padding: 10px 20px; text-decoration: none; border-radius: 5px; display: inline-block;">Join Tournament</a></p>
      </div>
    `,
    textContent: "Join {{tournamentName}} with {{prizePool}} prize pool! Entry: {{entryFee}}",
    variables: ["tournamentName", "playerName", "prizePool", "startDate", "endDate", "maxPlayers", "entryFee", "tournamentUrl"],
  },
  win_notification: {
    id: "win_notification",
    name: "Big Win Notification",
    subject: "🎉 Congratulations {{playerName}}! You Won {{amount}}!",
    htmlContent: `
      <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
        <h1 style="color: #34d399;">🎉 BIG WIN!</h1>
        <p>Dear {{playerName}},</p>
        <p>Congratulations! You just won <strong style="font-size: 24px; color: #34d399;">{{amount}}</strong> on {{gameName}}!</p>
        <p>Your multiplier: <strong>{{multiplier}}x</strong></p>
        <p><a href="{{gameUrl}}" style="background-color: #34d399; color: black; padding: 10px 20px; text-decoration: none; border-radius: 5px; display: inline-block;">Play Again</a></p>
      </div>
    `,
    textContent: "Congratulations! You won {{amount}} on {{gameName}} with {{multiplier}}x multiplier!",
    variables: ["playerName", "amount", "gameName", "multiplier", "gameUrl"],
  },
  daily_bonus: {
    id: "daily_bonus",
    name: "Daily Bonus Reminder",
    subject: "💰 Your {{amount}} Daily Bonus is Waiting!",
    htmlContent: `
      <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
        <h1 style="color: #3b82f6;">Daily Bonus Available!</h1>
        <p>Hi {{playerName}},</p>
        <p>Your daily bonus of {{amount}} is ready to claim!</p>
        <p><a href="{{claimUrl}}" style="background-color: #3b82f6; color: black; padding: 10px 20px; text-decoration: none; border-radius: 5px; display: inline-block;">Claim Bonus</a></p>
      </div>
    `,
    textContent: "Claim your {{amount}} daily bonus now!",
    variables: ["playerName", "amount", "claimUrl"],
  },
};

export async function createEmailCampaign(campaign: Omit<EmailCampaign, "id" | "createdAt" | "updatedAt" | "sentCount" | "openRate" | "clickRate">): Promise<EmailCampaign> {
  const id = `campaign_${Date.now()}`;
  const now = new Date();

  const newCampaign: EmailCampaign = {
    ...campaign,
    id,
    sentCount: 0,
    openRate: 0,
    clickRate: 0,
    createdAt: now,
    updatedAt: now,
  };

  // Store in database (mock implementation)
  console.log("[Email Marketing] Campaign created:", newCampaign);

  return newCampaign;
}

export async function getEmailTemplate(templateId: string): Promise<EmailTemplate | null> {
  return EMAIL_TEMPLATES[templateId] || null;
}

export async function renderEmailTemplate(templateId: string, variables: Record<string, string>): Promise<{ subject: string; html: string; text: string } | null> {
  const template = EMAIL_TEMPLATES[templateId];
  if (!template) return null;

  let subject = template.subject;
  let html = template.htmlContent;
  let text = template.textContent;

  // Replace variables
  for (const [key, value] of Object.entries(variables)) {
    const placeholder = `{{${key}}}`;
    subject = subject.replace(new RegExp(placeholder, "g"), value);
    html = html.replace(new RegExp(placeholder, "g"), value);
    text = text.replace(new RegExp(placeholder, "g"), value);
  }

  return { subject, html, text };
}

export async function sendEmailCampaign(campaignId: string, recipients: Array<{ email: string; variables: Record<string, string> }>): Promise<{ sent: number; failed: number; errors: string[] }> {
  const errors: string[] = [];
  let sent = 0;
  let failed = 0;

  for (const recipient of recipients) {
    try {
      // Mock email sending
      console.log(`[Email Marketing] Sending email to ${recipient.email}`);
      sent++;
    } catch (error) {
      failed++;
      errors.push(`Failed to send to ${recipient.email}: ${error}`);
    }
  }

  return { sent, failed, errors };
}

export async function generateEmailContent(prompt: string): Promise<string> {
  const response = await invokeLLM({
    messages: [
      {
        role: "system",
        content: "You are an expert email marketing copywriter for a social casino. Create engaging, persuasive email content that drives player engagement and retention.",
      },
      {
        role: "user",
        content: prompt,
      },
    ],
  });

  return response.choices[0]?.message.content || "";
}

export async function getTargetSegmentRecipients(segment: string): Promise<Array<{ id: number; email: string; name: string }>> {
  // Mock implementation - would query database for real recipients
  const mockRecipients = [
    { id: 1, email: "player1@example.com", name: "Player 1" },
    { id: 2, email: "player2@example.com", name: "Player 2" },
    { id: 3, email: "player3@example.com", name: "Player 3" },
  ];

  return mockRecipients;
}

export async function scheduleEmailCampaign(campaignId: string, scheduledTime: Date): Promise<void> {
  console.log(`[Email Marketing] Campaign ${campaignId} scheduled for ${scheduledTime.toISOString()}`);
  // In production, this would use a job queue like Bull or Agenda
}

export async function getCampaignStats(campaignId: string): Promise<{ sent: number; opened: number; clicked: number; bounced: number }> {
  // Mock implementation
  return {
    sent: 1000,
    opened: 450,
    clicked: 120,
    bounced: 25,
  };
}
