// src/app/api/admin/vacations/[id]/route.ts
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { getAdminUser } from "@/lib/auth";
import { sendMail } from "@/lib/mailer";
import {
  vacationApprovedEmailTemplate,
  vacationRejectedEmailTemplate,
} from "@/lib/email-templates";

export async function PATCH(
  req: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  const admin = await getAdminUser();
  if (!admin) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  const { id } = await params;
  const vacationId = Number(id);
  const body = await req.json();
  const { action, admin_note } = body as { action: "approve" | "reject"; admin_note?: string };

  if (!["approve", "reject"].includes(action)) {
    return NextResponse.json({ error: "Invalid action" }, { status: 400 });
  }

  const vacation = await prisma.student_vacations.findUnique({
    where: { id: vacationId },
    include: { students: { select: { name: true, email: true } } },
  });

  if (!vacation) {
    return NextResponse.json({ error: "Vacation request not found" }, { status: 404 });
  }
  if (vacation.status !== "pending") {
    return NextResponse.json({ error: "This request has already been processed" }, { status: 400 });
  }

  const newStatus = action === "approve" ? "approved" : "rejected";
  const startLabel = vacation.start_date.toISOString().slice(0, 10);
  const endLabel = vacation.end_date.toISOString().slice(0, 10);

  const updated = await prisma.student_vacations.update({
    where: { id: vacationId },
    data: { status: newStatus, admin_note: admin_note ?? null },
  });

  if (vacation.students?.email) {
    try {
      const html =
        action === "approve"
          ? vacationApprovedEmailTemplate(
              vacation.students.name,
              { startLabel, endLabel },
              admin_note ?? null,
              `${process.env.NEXT_PUBLIC_APP_URL}/student/schedule`
            )
          : vacationRejectedEmailTemplate(
              vacation.students.name,
              { startLabel, endLabel },
              admin_note ?? null,
              `${process.env.NEXT_PUBLIC_APP_URL}/student/schedule`
            );

      await sendMail({
        to: vacation.students.email,
        subject:
          action === "approve"
            ? "Your RKDA vacation request was approved"
            : "Your RKDA vacation request was not approved",
        html,
      });
    } catch (mailErr) {
      console.error("Vacation Decision Email Error:", mailErr);
    }
  }

  return NextResponse.json({ data: updated });
}