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

/**
 * نقل جماعي للطلبة من صف/شعبة إلى صف/شعبة أخرى
 * body: { fromGrade, fromClassroom, toGrade, toClassroom }
 */
export async function POST(req: NextRequest) {
  try {
    const user = await requirePageRole("students", "ADMIN", "STAFF", "SUPER_ADMIN");
    const schoolId = await resolveSchoolId(user, req.nextUrl.searchParams.get("schoolId"));
    const body = await req.json();
    const { fromGrade, fromClass, toGrade, toClass } = body as Record<string, string>;

    const fGrade = String(fromGrade || "").trim();
    const fClass = String(fromClass || "").trim();
    const tGrade = String(toGrade || "").trim();
    const tClass = String(toClass || "").trim();

    if (!fGrade && !fClass) throw new ApiError("حدد الصف أو الشعبة المصدر", 400);
    if (!tGrade || !tClass) throw new ApiError("يجب تحديد الصف والشعبة الهدف", 400);
    if (fGrade === tGrade && fClass === tClass) {
      throw new ApiError("المصدر والهدف متطابقان — لا يوجد نقل", 400);
    }
    if (!(await isValidGradeCode(tGrade, schoolId))) throw new ApiError("الصف الهدف غير صالح", 400);
    const targetClassroom = await db.classroom.findFirst({ where: { name: tClass, schoolId } });
    if (!targetClassroom) throw new ApiError("الشعبة الهدف غير موجودة", 400);

    const students = await db.student.findMany({
      where: {
        grade: fGrade || undefined,
        classroom: fClass || undefined,
        isActive: true,
        schoolId,
      },
      select: { id: true, nameAr: true, studentCode: true },
    });
    if (students.length === 0) throw new ApiError("لا يوجد طلبة مطابقون للنقل", 400);

    await db.student.updateMany({
      where: { id: { in: students.map((s) => s.id) } },
      data: { grade: tGrade, classroom: tClass },
    });

    await logAudit(user, {
      action: "UPDATE",
      entity: "Student",
      details: `نقل جماعي لـ ${students.length} طالب إلى ${tGrade} / شعبة ${tClass}`,
    });

    return NextResponse.json({
      transferred: students.length,
      students: students.map((s) => ({ id: s.id, nameAr: s.nameAr, studentCode: s.studentCode })),
    });
  } catch (err) {
    return handleApiError(err);
  }
}
