import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { verifyToken, getTokenFromRequest } from "@/lib/jwt";
import { z } from "zod";

// Schema untuk validasi Jurusan
const JurusanSchema = z.object({
  kodeJurusan: z.string().min(1, "Kode jurusan tidak boleh kosong"),
  namaJurusan: z.string().min(1, "Nama jurusan tidak boleh kosong"),
  jenjang: z.string().min(1, "Jenjang tidak boleh kosong"),
});

// PUT - Update jurusan
export async function PUT(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  try {
    const token = getTokenFromRequest(request);

    if (!token) {
      return NextResponse.json({ success: false, message: "Token tidak ditemukan" }, { status: 401 });
    }

    const payload = verifyToken(token);
    if (!payload) {
      return NextResponse.json({ success: false, message: "Token tidak valid" }, { status: 401 });
    }

    // Check if user is admin
    if (payload.role !== "ADMIN") {
      return NextResponse.json({ success: false, message: "Hanya admin yang dapat mengubah jurusan" }, { status: 403 });
    }

    const { id } = await params;
    const body = await request.json();
    const { kodeJurusan, namaJurusan, jenjang } = JurusanSchema.parse(body);

    // Check if jurusan exists
    const existingJurusan = await prisma.jurusan.findUnique({
      where: { id },
    });

    if (!existingJurusan) {
      return NextResponse.json({ success: false, message: "Jurusan tidak ditemukan" }, { status: 404 });
    }

    // Check if kode jurusan is already used by another jurusan
    const duplicateJurusan = await prisma.jurusan.findFirst({
      where: {
        kodeJurusan,
        id: { not: id },
      },
    });

    if (duplicateJurusan) {
      return NextResponse.json({ success: false, message: "Kode jurusan sudah digunakan" }, { status: 400 });
    }

    const jurusan = await prisma.jurusan.update({
      where: { id },
      data: {
        kodeJurusan,
        namaJurusan,
        jenjang,
      },
    });

    return NextResponse.json({
      success: true,
      data: jurusan,
      message: "Jurusan berhasil diperbarui",
    });
  } catch (error) {
    console.error("Error updating jurusan:", error);

    if (error instanceof z.ZodError) {
      return NextResponse.json(
        {
          success: false,
          message: "Data tidak valid",
          errors: error.errors,
        },
        { status: 400 },
      );
    }

    return NextResponse.json({ success: false, message: "Terjadi kesalahan server" }, { status: 500 });
  }
}

// DELETE - Hapus jurusan
export async function DELETE(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  try {
    const token = getTokenFromRequest(request);

    if (!token) {
      return NextResponse.json({ success: false, message: "Token tidak ditemukan" }, { status: 401 });
    }

    const payload = verifyToken(token);
    if (!payload) {
      return NextResponse.json({ success: false, message: "Token tidak valid" }, { status: 401 });
    }

    // Check if user is admin
    if (payload.role !== "ADMIN") {
      return NextResponse.json(
        { success: false, message: "Hanya admin yang dapat menghapus jurusan" },
        { status: 403 },
      );
    }

    const { id } = await params;

    // Check if jurusan exists
    const existingJurusan = await prisma.jurusan.findUnique({
      where: { id },
      include: {
        _count: {
          select: { siswa: true },
        },
      },
    });

    if (!existingJurusan) {
      return NextResponse.json({ success: false, message: "Jurusan tidak ditemukan" }, { status: 404 });
    }

    // Check if jurusan is still used by siswa
    if (existingJurusan._count.siswa > 0) {
      return NextResponse.json(
        { success: false, message: "Jurusan tidak dapat dihapus karena masih digunakan oleh siswa" },
        { status: 400 },
      );
    }

    await prisma.jurusan.delete({
      where: { id },
    });

    return NextResponse.json({
      success: true,
      message: "Jurusan berhasil dihapus",
    });
  } catch (error) {
    console.error("Error deleting jurusan:", error);
    return NextResponse.json({ success: false, message: "Terjadi kesalahan server" }, { status: 500 });
  }
}
