import { randomBytes } from "crypto";

import { NextResponse } from "next/server";

import { auth } from "@/auth";

import { prisma } from "@/lib/prisma";

type CreatePreviewRequest = {
  clientName?: string;
  campaignName?: string;
  creativeName?: string;
  vendor?: string;
  vendorUrl?: string;
};

export async function POST(request: Request) {
  try {

    const session = await auth();
    
    if (!session?.user) {
        return NextResponse.json(
            { error: "Unauthorized." },
            { status: 401 },
        );
    }

    const body = (await request.json()) as CreatePreviewRequest;

    const clientName = body.clientName?.trim();
    const campaignName = body.campaignName?.trim();
    const creativeName = body.creativeName?.trim();
    const vendor = body.vendor?.trim().toLowerCase();
    const vendorUrl = body.vendorUrl?.trim();

    if (!clientName || !campaignName || !creativeName || !vendor || !vendorUrl) {
      return NextResponse.json(
        { error: "Please complete every field." },
        { status: 400 },
      );
    }

    if (vendor !== "flashtalking" && vendor !== "nexd") {
      return NextResponse.json(
        { error: "Please select a valid vendor." },
        { status: 400 },
      );
    }

    try {
      const url = new URL(vendorUrl);

      if (url.protocol !== "http:" && url.protocol !== "https:") {
        throw new Error("Invalid URL protocol");
      }
    } catch {
      return NextResponse.json(
        { error: "Please enter a valid preview URL." },
        { status: 400 },
      );
    }

    let campaign = await prisma.campaign.findFirst({
      where: {
        clientName,
        name: campaignName,
      },
    });

    if (!campaign) {
      campaign = await prisma.campaign.create({
        data: {
          clientName,
          name: campaignName,
        },
      });
    }

    const token = randomBytes(8).toString("hex");

    const preview = await prisma.preview.create({
      data: {
        campaignId: campaign.id,
        creativeName,
        vendor,
        vendorUrl,
        publicToken: token,
      },
    });

    const publicUrl = new URL(`/preview/${token}`, request.url).toString();

    return NextResponse.json(
      {
        previewId: preview.id,
        publicUrl,
      },
      { status: 201 },
    );
  } catch (error) {
    console.error("Failed to create preview:", error);

    return NextResponse.json(
      { error: "Something went wrong while creating the preview." },
      { status: 500 },
    );
  }
}