import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { requirePageRole, requirePageUser, resolveSchoolId, ApiError } from "@/lib/auth";
import { logAudit } from "@/lib/audit";
import { handleApiError } from "@/lib/api-helpers";

/** الشعب الدراسية مع عدد الطلبة النشطين في كل شعبة (نطاق المدرسة) */
export async function GET(req: NextRequest) {
  try {
    const viewer = await requirePageUser("classes");
    const schoolId = await resolveSchoolId(viewer, req.nextUrl.searchParams.get("schoolId"));
    const classrooms = await db.classroom.findMany({ where: { schoolId }, orderBy: { createdAt: "asc" } });
    const counts = await db.student.groupBy({
      by: ["classroom"],
      where: { isActive: true, schoolId },
      _count: { _all: true },
    });
    const countMap = new Map(counts.map((c) => [c.classroom, c._count._all]));
    return NextResponse.json({
      classrooms: classrooms.map((c) => ({
        id: c.id,
        name: c.name,
        studentsCount: countMap.get(c.name) ?? 0,
      })),
    });
  } catch (err) {
    return handleApiError(err);
  }
}

/** إضافة شعبة جديدة (داخل المدرسة) */
export async function POST(req: NextRequest) {
  try {
    const user = await requirePageRole("classes", "ADMIN", "SUPER_ADMIN");
    const schoolId = await resolveSchoolId(user, req.nextUrl.searchParams.get("schoolId"));
    const body = await req.json();
    const name = String(body.name || "").trim();
    if (!name || name.length > 20) throw new ApiError("اسم الشعبة مطلوب (20 خانة كحد أقصى)", 400);
    const exists = await db.classroom.findFirst({ where: { name, schoolId } });
    if (exists) throw new ApiError("يوجد شعبة بهذا الاسم مسبقاً", 409);
    const created = await db.classroom.create({ data: { name, schoolId } });
    await logAudit(user, { action: "CREATE", entity: "Classroom", entityId: created.id, details: `إضافة شعبة جديدة: ${name}` });
    return NextResponse.json({ classroom: created }, { status: 201 });
  } catch (err) {
    return handleApiError(err);
  }
}

/** تعديل اسم شعبة مع تحديث كل الطلبة المرتبطين بها (داخل المدرسة) */
export async function PATCH(req: NextRequest) {
  try {
    const user = await requirePageRole("classes", "ADMIN", "SUPER_ADMIN");
    const schoolId = await resolveSchoolId(user, req.nextUrl.searchParams.get("schoolId"));
    const body = await req.json();
    const { id, name } = body as Record<string, string>;
    if (!id) throw new ApiError("معرف الشعبة مطلوب", 400);
    const newName = String(name || "").trim();
    if (!newName || newName.length > 20) throw new ApiError("اسم الشعبة مطلوب (20 خانة كحد أقصى)", 400);
    const existing = await db.classroom.findUnique({ where: { id } });
    if (!existing || existing.schoolId !== schoolId) throw new ApiError("الشعبة غير موجودة", 404);
    const dup = await db.classroom.findFirst({ where: { name: newName, schoolId } });
    if (dup && dup.id !== id) throw new ApiError("يوجد شعبة بهذا الاسم مسبقاً", 409);
    const old = existing.name;
    const updated = await db.classroom.update({ where: { id }, data: { name: newName } });
    if (old !== newName) {
      await db.student.updateMany({ where: { classroom: old, schoolId }, data: { classroom: newName } });
    }
    await logAudit(user, { action: "UPDATE", entity: "Classroom", entityId: id, details: `تعديل اسم شعبة من "${old}" إلى "${newName}"` });
    return NextResponse.json({ classroom: updated });
  } catch (err) {
    return handleApiError(err);
  }
}

/** حذف شعبة (فقط إذا لا يوجد طلبة فيها) */
export async function DELETE(req: NextRequest) {
  try {
    const user = await requirePageRole("classes", "ADMIN", "SUPER_ADMIN");
    const schoolId = await resolveSchoolId(user, req.nextUrl.searchParams.get("schoolId"));
    const { searchParams } = new URL(req.url);
    const id = searchParams.get("id");
    if (!id) throw new ApiError("معرف الشعبة مطلوب", 400);
    const existing = await db.classroom.findUnique({ where: { id } });
    if (!existing || existing.schoolId !== schoolId) throw new ApiError("الشعبة غير موجودة", 404);
    const studentsCount = await db.student.count({ where: { classroom: existing.name, schoolId, isActive: true } });
    if (studentsCount > 0) {
      throw new ApiError(`لا يمكن حذف الشعبة (${existing.name}) لأن فيها ${studentsCount} طالب — انقل الطلبة أولاً`, 400);
    }
    await db.classroom.delete({ where: { id } });
    await logAudit(user, { action: "DELETE", entity: "Classroom", entityId: id, details: `حذف شعبة: ${existing.name}` });
    return NextResponse.json({ ok: true });
  } catch (err) {
    return handleApiError(err);
  }
}
