import { after, NextResponse } from "next/server";
import { BillingInterval, SubscriptionStatus } from "@prisma/client";
import { z } from "zod";
import { isFreshWooSsoIssue, upsertWooAccount, verifyWooSsoRequest } from "@/lib/auth/woo-sso";
import { syncWooEntitlement } from "@/lib/billing/woo-entitlement";
import { syncOrganizationLicenses } from "@/lib/site-agent/license-sync";

const requestSchema = z.object({
  customerId: z.string().trim().min(1).max(100),
  email: z.string().trim().email().max(254),
  name: z.string().trim().max(100).optional(),
  organizationName: z.string().trim().max(100).optional(),
  providerSubscriptionId: z.string().trim().min(1).max(100),
  planCode: z.string().trim().min(1).max(64),
  status: z.nativeEnum(SubscriptionStatus),
  billingInterval: z.nativeEnum(BillingInterval),
  currentPeriodEnd: z.string().datetime().nullable().optional(),
  trialEndsAt: z.string().datetime().nullable().optional(),
  issuedAt: z.string().datetime(),
});

export async function POST(request: Request) {
  const rawBody = await request.text();
  if (!verifyWooSsoRequest(request, rawBody)) return NextResponse.json({ message: "Invalid WooCommerce bridge request." }, { status: 401 });

  let rawPayload: unknown;
  try {
    rawPayload = JSON.parse(rawBody);
  } catch {
    return NextResponse.json({ message: "Invalid WooCommerce bridge request." }, { status: 400 });
  }

  const input = requestSchema.safeParse(rawPayload);
  if (!input.success || !isFreshWooSsoIssue(input.data.issuedAt)) {
    return NextResponse.json({ message: "This WooCommerce bridge request has expired." }, { status: 400 });
  }

  try {
    const account = await upsertWooAccount(input.data);
    const subscription = await syncWooEntitlement(account, input.data);
    after(async () => {
      try { await syncOrganizationLicenses(account.organizationId); }
      catch { console.error("License sync after WooCommerce subscription update failed."); }
    });
    return NextResponse.json({ ok: true, organizationId: account.organizationId, planCode: subscription.plan.code, status: subscription.status, licenses: "scheduled" });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Unable to sync WooCommerce subscription.";
    return NextResponse.json({ message }, { status: 500 });
  }
}
