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

// Schema untuk validasi Mapel
const MapelSchema = z.object({
  kodeMapel: z.string().min(1, "Kode mata pelajaran tidak boleh kosong"),
  namaMapel: z.string().min(1, "Nama mata pelajaran tidak boleh kosong"),
});

// PUT - Update mapel
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 or guru
    if (payload.role !== "ADMIN" && payload.role !== "GURU") {
      return NextResponse.json(
        { success: false, message: "Hanya admin dan guru yang dapat mengupdate mata pelajaran" },
        { status: 403 },
      );
    }

    const { id } = await params;
    const body = await request.json();
    const { kodeMapel, namaMapel } = MapelSchema.parse(body);

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

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

    // Check if kode mapel already exists (except current mapel)
    const duplicateMapel = await prisma.mapel.findFirst({
      where: {
        kodeMapel,
        NOT: { id },
      },
    });

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

    const mapel = await prisma.mapel.update({
      where: { id },
      data: {
        kodeMapel,
        namaMapel,
      },
    });

    return NextResponse.json({
      success: true,
      data: mapel,
      message: "Mata pelajaran berhasil diperbarui",
    });
  } catch (error) {
    console.error("Error updating mapel:", 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 mapel
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 mata pelajaran" },
        { status: 403 },
      );
    }

    // Check if mapel exists
    const existingMapel = await prisma.mapel.findUnique({
      where: { id: (await params).id },
    });

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

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

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