import type { FastifyInstance } from "fastify";

import { isoNow } from "../lib/utils.js";
import { supabaseAdmin } from "../lib/supabase.js";
import { logCampaignActivity, logContactActivity } from "../services/activity-log-service.js";
import { ResendProvider } from "../services/email/resend-provider.js";
import { applyContactSuppressionStatus } from "../services/unsubscribe-service.js";

const provider = new ResendProvider();

export function registerWebhookRoutes(app: FastifyInstance) {
  app.post("/api/webhooks/email/resend", async (request) => {
    const rawBody = typeof request.body === "string" ? request.body : JSON.stringify(request.body ?? {});
    const event = await provider.parseWebhookEvent(request.headers as Record<string, string | undefined>, rawBody);

    if (!event) {
      return {
        success: true
      };
    }

    const { data: message } = await supabaseAdmin
      .from("email_provider_messages")
      .select("id, organization_id, campaign_id, campaign_send_id")
      .eq("provider", event.provider)
      .eq("external_message_id", event.externalId)
      .maybeSingle();

    let contactId: string | null = null;
    if (message?.campaign_send_id) {
      const { data: send } = await supabaseAdmin
        .from("campaign_sends")
        .select("contact_id")
        .eq("id", message.campaign_send_id)
        .maybeSingle();

      contactId = String(send?.contact_id ?? "") || null;
    }

    await supabaseAdmin.from("email_events").insert({
      organization_id: message?.organization_id,
      campaign_id: message?.campaign_id,
      campaign_send_id: message?.campaign_send_id,
      contact_id: contactId,
      provider: event.provider,
      event_type: event.eventType,
      event_source: "provider_webhook",
      external_message_id: event.externalId,
      recipient: event.recipient,
      payload: event.payload,
      created_at: isoNow()
    });

    if (message?.campaign_send_id) {
      const statusMap: Record<string, string> = {
        "email.sent": "sent",
        "email.delivered": "sent",
        "email.bounced": "bounced",
        "email.complained": "complained",
        "email.opened": "opened",
        "email.clicked": "clicked"
      };

      const nextStatus = statusMap[event.eventType] ?? "sent";

      await supabaseAdmin
        .from("campaign_sends")
        .update({
          status: nextStatus,
          updated_at: isoNow()
        })
        .eq("id", message.campaign_send_id);
    }

    if (message?.campaign_id && message?.organization_id) {
      await logCampaignActivity({
        organizationId: String(message.organization_id),
        campaignId: String(message.campaign_id),
        campaignSendId: message.campaign_send_id ? String(message.campaign_send_id) : null,
        action: "campaign.delivery_event",
        metadata: {
          eventType: event.eventType,
          provider: event.provider,
          recipient: event.recipient,
          externalMessageId: event.externalId,
        }
      });
    }

    if (contactId && message?.organization_id) {
      if (event.eventType === "email.complained" || event.eventType === "email.bounced") {
        await applyContactSuppressionStatus({
          organizationId: String(message.organization_id),
          contactId,
          status: event.eventType === "email.complained" ? "complained" : "bounced",
          source: "provider_webhook",
          reason: event.eventType,
          campaignId: message?.campaign_id ? String(message.campaign_id) : null,
          campaignSendId: message?.campaign_send_id ? String(message.campaign_send_id) : null,
          requestMetadata: {
            provider: event.provider,
            externalMessageId: event.externalId,
            recipient: event.recipient,
          }
        });
      } else {
        await supabaseAdmin
          .from("contacts")
          .update({
            last_activity_at: isoNow(),
            updated_at: isoNow()
          })
          .eq("id", contactId)
          .eq("organization_id", message.organization_id);
      }

      await logContactActivity({
        organizationId: String(message.organization_id),
        contactId,
        action: "contact.email_event",
        metadata: {
          eventType: event.eventType,
          campaignId: message?.campaign_id ? String(message.campaign_id) : null,
          recipient: event.recipient,
          provider: event.provider,
        }
      });
    }

    return {
      success: true
    };
  });
}
