import { invokeLLM } from "./llm.ts";

export interface AdminAlertEmailConfig {
  adminEmail: string;
  adminName: string;
  alertType: string;
  alertTitle: string;
  alertMessage: string;
  severity: 'low' | 'medium' | 'high' | 'critical';
  actionUrl?: string;
  metadata?: Record<string, any>;
}

/**
 * Send email notification for admin alerts
 */
export async function sendAdminAlertEmail(config: AdminAlertEmailConfig): Promise<boolean> {
  try {
    const severityColors = {
      low: '#3B82F6',
      medium: '#F59E0B',
      high: '#EF4444',
      critical: '#DC2626',
    };

    const severityBgColors = {
      low: '#DBEAFE',
      medium: '#FEF3C7',
      high: '#FEE2E2',
      critical: '#FEE2E2',
    };

    const color = severityColors[config.severity];
    const bgColor = severityBgColors[config.severity];

    // Generate HTML email using LLM for better formatting
    const emailHtml = await generateAlertEmailHTML(config, color, bgColor);

    // In production, integrate with SendGrid/Mailgun/SES
    console.log(`[AdminAlertEmailNotifier] Sending ${config.severity} alert email to ${config.adminEmail}`);
    console.log(`[AdminAlertEmailNotifier] Alert: ${config.alertTitle}`);

    // TODO: Integrate with actual email provider
    // await emailProvider.send({
    //   to: config.adminEmail,
    //   subject: `[${config.severity.toUpperCase()}] ${config.alertTitle}`,
    //   html: emailHtml,
    // });

    return true;
  } catch (error) {
    console.error('[AdminAlertEmailNotifier] Error sending alert email:', error);
    return false;
  }
}

/**
 * Generate formatted HTML email for admin alerts
 */
async function generateAlertEmailHTML(
  config: AdminAlertEmailConfig,
  color: string,
  bgColor: string
): Promise<string> {
  const actionButton = config.actionUrl
    ? `
    <table role="presentation" border="0" cellpadding="0" cellspacing="0" style="margin: 20px 0;">
      <tr>
        <td>
          <a href="${config.actionUrl}" style="background-color: ${color}; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block; font-weight: 600;">
            View Details
          </a>
        </td>
      </tr>
    </table>
  `
    : '';

  const metadataSection = config.metadata
    ? `
    <div style="margin-top: 20px; padding: 15px; background-color: #F3F4F6; border-radius: 6px; border-left: 4px solid ${color};">
      <h4 style="margin: 0 0 10px 0; color: #1F2937;">Additional Details:</h4>
      <ul style="margin: 0; padding-left: 20px; color: #4B5563;">
        ${Object.entries(config.metadata)
          .map(([key, value]) => `<li><strong>${key}:</strong> ${JSON.stringify(value)}</li>`)
          .join('')}
      </ul>
    </div>
  `
    : '';

  return `
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
          body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; }
          .container { max-width: 600px; margin: 0 auto; padding: 20px; }
          .header { background-color: ${bgColor}; border-left: 4px solid ${color}; padding: 20px; border-radius: 6px; margin-bottom: 20px; }
          .header h2 { margin: 0 0 5px 0; color: ${color}; font-size: 20px; }
          .header p { margin: 0; color: #666; font-size: 14px; }
          .content { padding: 20px; background-color: #FFFFFF; border: 1px solid #E5E7EB; border-radius: 6px; }
          .footer { margin-top: 30px; padding-top: 20px; border-top: 1px solid #E5E7EB; font-size: 12px; color: #999; text-align: center; }
        </style>
      </head>
      <body>
        <div class="container">
          <div class="header">
            <h2>${config.alertTitle}</h2>
            <p>Severity: <strong>${config.severity.toUpperCase()}</strong> • ${new Date().toLocaleString()}</p>
          </div>

          <div class="content">
            <p>${config.alertMessage}</p>
            ${actionButton}
            ${metadataSection}
          </div>

          <div class="footer">
            <p>This is an automated alert from CoinKrazy Admin System</p>
            <p>Admin: ${config.adminName}</p>
          </div>
        </div>
      </body>
    </html>
  `;
}

/**
 * Send batch email notifications to multiple admins
 */
export async function sendBatchAdminAlertEmails(
  adminEmails: Array<{ email: string; name: string }>,
  alertConfig: Omit<AdminAlertEmailConfig, 'adminEmail' | 'adminName'>
): Promise<{ sent: number; failed: number }> {
  let sent = 0;
  let failed = 0;

  for (const admin of adminEmails) {
    const success = await sendAdminAlertEmail({
      ...alertConfig,
      adminEmail: admin.email,
      adminName: admin.name,
    });

    if (success) {
      sent++;
    } else {
      failed++;
    }
  }

  return { sent, failed };
}

/**
 * Alert templates for common scenarios
 */
export const AdminAlertEmailTemplates = {
  fraudDetected: (adminEmail: string, adminName: string, userId: number, details: string) =>
    sendAdminAlertEmail({
      adminEmail,
      adminName,
      alertType: 'fraud',
      alertTitle: '🚨 Fraud Alert Detected',
      alertMessage: `Potential fraud has been detected for user #${userId}. ${details}`,
      severity: 'critical',
      actionUrl: `/admin/fraud-detection?userId=${userId}`,
      metadata: { userId, detectedAt: new Date().toISOString() },
    }),

  deploymentFailed: (adminEmail: string, adminName: string, version: string, error: string) =>
    sendAdminAlertEmail({
      adminEmail,
      adminName,
      alertType: 'deployment',
      alertTitle: '❌ Deployment Failed',
      alertMessage: `Deployment of version ${version} failed with error: ${error}`,
      severity: 'high',
      actionUrl: '/admin/deployments',
      metadata: { version, error },
    }),

  highErrorRate: (adminEmail: string, adminName: string, errorRate: number, threshold: number) =>
    sendAdminAlertEmail({
      adminEmail,
      adminName,
      alertType: 'performance',
      alertTitle: '⚠️ High Error Rate',
      alertMessage: `Error rate is ${errorRate}% (threshold: ${threshold}%)`,
      severity: 'high',
      actionUrl: '/admin/system-monitoring',
      metadata: { errorRate, threshold },
    }),

  paymentFailed: (adminEmail: string, adminName: string, amount: number, userId: number, reason: string) =>
    sendAdminAlertEmail({
      adminEmail,
      adminName,
      alertType: 'payment',
      alertTitle: '💳 Payment Processing Failed',
      alertMessage: `Payment of $${amount} for user #${userId} failed: ${reason}`,
      severity: 'high',
      actionUrl: '/admin/payments-banking',
      metadata: { amount, userId, reason },
    }),

  kycRejected: (adminEmail: string, adminName: string, userName: string, userId: number, reason: string) =>
    sendAdminAlertEmail({
      adminEmail,
      adminName,
      alertType: 'kyc',
      alertTitle: '❌ KYC Verification Rejected',
      alertMessage: `KYC verification for ${userName} (ID: ${userId}) was rejected: ${reason}`,
      severity: 'medium',
      actionUrl: '/admin/kyc-review',
      metadata: { userName, userId, reason },
    }),

  systemMaintenance: (adminEmail: string, adminName: string, duration: number) =>
    sendAdminAlertEmail({
      adminEmail,
      adminName,
      alertType: 'system',
      alertTitle: '🔧 System Maintenance Started',
      alertMessage: `System maintenance has started. Expected duration: ${duration} minutes.`,
      severity: 'medium',
      actionUrl: '/admin/settings',
      metadata: { duration, startedAt: new Date().toISOString() },
    }),
};
