
import { NextResponse } from "next/server";

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

type ApprovalRequest = {
  previewId?: string;
  reviewerName?: string;
  reviewerEmail?: string;
  decision?: string;
  notes?: string;
};

export async function POST(request: Request) {
  try {
    const body = (await request.json()) as ApprovalRequest;

    const previewId = body.previewId?.trim();
    const reviewerName = body.reviewerName?.trim();
    const reviewerEmail = body.reviewerEmail?.trim().toLowerCase();
    const decision = body.decision?.trim().toLowerCase();
    const notes = body.notes?.trim() || null;

    if (!previewId || !reviewerName || !reviewerEmail || !decision) {
      return NextResponse.json(
        { error: "Please complete your name, email and decision." },
        { status: 400 },
      );
    }

    if (decision !== "approved" && decision !== "changes_requested") {
      return NextResponse.json(
        { error: "Please select a valid decision." },
        { status: 400 },
      );
    }

    const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

    if (!emailPattern.test(reviewerEmail)) {
      return NextResponse.json(
        { error: "Please enter a valid email address." },
        { status: 400 },
      );
    }

    const preview = await prisma.preview.findUnique({
      where: { id: previewId },
      select: { id: true },
    });

    if (!preview) {
      return NextResponse.json(
        { error: "This preview could not be found." },
        { status: 404 },
      );
    }

    const approval = await prisma.$transaction(async (transaction) => {
      const createdApproval = await transaction.approval.create({
        data: {
          previewId,
          reviewerName,
          reviewerEmail,
          decision,
          notes,
        },
      });

      await transaction.preview.update({
        where: { id: previewId },
        data: { status: decision },
      });

      return createdApproval;
    });

    return NextResponse.json(
      {
        approvalId: approval.id,
        status: decision,
      },
      { status: 201 },
    );
  } catch (error) {
    console.error("Failed to submit approval:", error);

    return NextResponse.json(
      { error: "Error occured while submitting your decision" },
      { status: 500 },
    );
  }
}
