/**
 * Brevo Webhook Handler
 * Processes bounce, complaint, and unsubscribe events from Brevo
 */

import type { Request, Response } from 'express';
import { getDb } from '../db.ts';
import { users } from '../../drizzle/schema.ts';
import { eq } from 'drizzle-orm';

export interface BrevoWebhookEvent {
  event: 'bounce' | 'complaint' | 'unsubscribe' | 'click' | 'open' | 'delivered' | 'sent';
  email: string;
  timestamp: number;
  messageId?: string;
  campaignId?: string;
  reason?: string;
  bounceType?: 'permanent' | 'temporary';
}

/**
 * Handle Brevo webhook events
 */
export async function handleBrevoWebhook(req: Request, res: Response) {
  try {
    const events: BrevoWebhookEvent[] = req.body.events || [req.body];

    console.log(`[Brevo Webhook] Received ${events.length} event(s)`);

    for (const event of events) {
      await processBrevoEvent(event);
    }

    res.json({ success: true, processed: events.length });
  } catch (error) {
    console.error('[Brevo Webhook] Error processing webhook:', error);
    res.status(500).json({ success: false, error: 'Internal server error' });
  }
}

/**
 * Process individual Brevo event
 */
async function processBrevoEvent(event: BrevoWebhookEvent) {
  const db = await getDb();
  if (!db) {
    console.error('[Brevo Webhook] Database unavailable');
    return;
  }

  try {
    switch (event.event) {
      case 'bounce':
        await handleBounce(db, event);
        break;
      case 'complaint':
        await handleComplaint(db, event);
        break;
      case 'unsubscribe':
        await handleUnsubscribe(db, event);
        break;
      case 'click':
        await handleClick(event);
        break;
      case 'open':
        await handleOpen(event);
        break;
      case 'delivered':
        console.log(`[Brevo Webhook] Email delivered to ${event.email}`);
        break;
      case 'sent':
        console.log(`[Brevo Webhook] Email sent to ${event.email}`);
        break;
      default:
        console.log(`[Brevo Webhook] Unknown event type: ${event.event}`);
    }
  } catch (error) {
    console.error(`[Brevo Webhook] Error processing ${event.event} event:`, error);
  }
}

/**
 * Handle bounce event - mark email as invalid
 */
async function handleBounce(db: any, event: BrevoWebhookEvent) {
  console.log(`[Brevo Webhook] Bounce event for ${event.email} (${event.bounceType})`);

  // For permanent bounces, mark user email as invalid
  if (event.bounceType === 'permanent') {
    const user = await db.query.users.findFirst({
      where: eq(users.email, event.email),
    });

    if (user) {
      // Store bounce information in metadata or create a separate table
      console.log(`[Brevo Webhook] Marking email ${event.email} as permanently bounced`);
      // TODO: Update user metadata or create bounce log table
    }
  }
}

/**
 * Handle complaint event - mark email as complained
 */
async function handleComplaint(db: any, event: BrevoWebhookEvent) {
  console.log(`[Brevo Webhook] Complaint event for ${event.email}`);

  const user = await db.query.users.findFirst({
    where: eq(users.email, event.email),
  });

  if (user) {
    // Mark user as complained/unsubscribed
    console.log(`[Brevo Webhook] Marking email ${event.email} as complained`);
    // TODO: Update user status or create complaint log table
  }
}

/**
 * Handle unsubscribe event
 */
async function handleUnsubscribe(db: any, event: BrevoWebhookEvent) {
  console.log(`[Brevo Webhook] Unsubscribe event for ${event.email}`);

  const user = await db.query.users.findFirst({
    where: eq(users.email, event.email),
  });

  if (user) {
    // Mark user as unsubscribed
    console.log(`[Brevo Webhook] Marking email ${event.email} as unsubscribed`);
    // TODO: Update user subscription status
  }
}

/**
 * Handle click event - track campaign engagement
 */
async function handleClick(event: BrevoWebhookEvent) {
  console.log(`[Brevo Webhook] Click event for ${event.email} in campaign ${event.campaignId}`);
  // TODO: Update campaign click statistics
}

/**
 * Handle open event - track campaign engagement
 */
async function handleOpen(event: BrevoWebhookEvent) {
  console.log(`[Brevo Webhook] Open event for ${event.email} in campaign ${event.campaignId}`);
  // TODO: Update campaign open statistics
}

/**
 * Verify Brevo webhook signature (optional but recommended)
 */
export function verifyBrevoWebhookSignature(
  payload: string,
  signature: string,
  webhookSecret: string
): boolean {
  // Brevo uses HMAC-SHA256 for signatures
  // Implementation depends on Brevo's specific signature format
  // For now, we'll skip verification and rely on IP whitelisting
  return true;
}
