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 { GRADES } from "@/lib/constants";

/** الصفوف الدراسية المضافة من الإدارة + أكواد الصفوف الأساسية المخفية (نطاق المدرسة) */
export async function GET(req: NextRequest) {
  try {
    const viewer = await requirePageRole("classes", "ADMIN", "ACCOUNTANT", "STAFF");
    const schoolId = await resolveSchoolId(viewer, req.nextUrl.searchParams.get("schoolId"));
    const [grades, hidden] = await Promise.all([
      db.customGrade.findMany({ where: { schoolId }, orderBy: { createdAt: "asc" } }),
      db.hiddenGrade.findMany({ where: { schoolId }, orderBy: { createdAt: "asc" } }),
    ]);
    return NextResponse.json({ grades, hiddenGrades: hidden.map((h) => h.code) });
  } catch (err) {
    return handleApiError(err);
  }
}

/**
 * إضافة صف جديد (كود تلقائي CGn) أو استعادة صف أساسي مخفي
 * - body: { nameAr, code? } → إضافة صف مخصص
 * - body: { restoreCode } → استعادة صف أساسي مخفي مثل G3
 */
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().catch(() => ({}));

    // استعادة صف أساسي مخفي
    if (body.restoreCode) {
      const code = String(body.restoreCode).trim().toUpperCase();
      const def = GRADES.find((g) => g.code === code);
      if (!def) throw new ApiError("الصف المطلوب استعادته ليس من الصفوف الأساسية", 400);
      const deleted = await db.hiddenGrade.deleteMany({ where: { code, schoolId } });
      if (deleted.count === 0) throw new ApiError("هذا الصف غير مخفي أصلاً", 400);
      await logAudit(user, {
        action: "RESTORE",
        entity: "Grade",
        entityId: code,
        details: `استعادة صف أساسي مخفي: ${def.labelAr} (${code})`,
      });
      return NextResponse.json({ ok: true, restored: code });
    }

    // إضافة صف مخصص جديد
    const nameAr = String(body.nameAr || "").trim();
    let code = String(body.code || "").trim().toUpperCase();
    if (!nameAr || nameAr.length > 30) throw new ApiError("اسم الصف مطلوب (30 خانة كحد أقصى)", 400);
    if (!/^[A-Z0-9]{1,4}$/.test(code)) {
      const count = await db.customGrade.count({ where: { schoolId } });
      code = `CG${count + 1}`;
    }
    const dupCode = await db.customGrade.findFirst({ where: { code, schoolId } });
    if (dupCode) throw new ApiError("كود الصف محجوز مسبقاً — اختر بادئة أخرى", 409);
    const dupName = await db.customGrade.findFirst({ where: { nameAr, schoolId } });
    if (dupName) throw new ApiError("يوجد صف بهذا الاسم مسبقاً", 409);
    const created = await db.customGrade.create({ data: { code, nameAr, schoolId } });
    await logAudit(user, { action: "CREATE", entity: "CustomGrade", entityId: created.id, details: `إضافة صف جديد: ${nameAr} (${code})` });
    return NextResponse.json({ grade: created }, { status: 201 });
  } catch (err) {
    return handleApiError(err);
  }
}

/**
 * حذف صف:
 * - ?id=... صف مخصص → حذف نهائي (فقط إن لا يوجد طلبة مسجلون فيه)
 * - ?code=... صف أساسي مثل G3 → إخفاء (فقط إن لا يوجد طلبة نشطون) — قابل للاستعادة
 */
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");
    const code = searchParams.get("code");

    // إخفاء صف أساسي
    if (code) {
      const def = GRADES.find((g) => g.code === code.toUpperCase());
      if (!def) throw new ApiError("هذا الكود ليس من الصفوف الأساسية", 400);
      const activeStudents = await db.student.count({ where: { grade: def.code, isActive: true, schoolId } });
      if (activeStudents > 0) {
        throw new ApiError(`لا يمكن حذف الصف (${def.labelAr}) لأن فيه ${activeStudents} طالب نشط — انقل الطلبة أولاً`, 400);
      }
      await db.hiddenGrade.upsert({
        where: { code_schoolId: { code: def.code, schoolId } },
        update: {},
        create: { code: def.code, schoolId },
      });
      await logAudit(user, {
        action: "DELETE",
        entity: "Grade",
        entityId: def.code,
        details: `حذف (إخفاء) صف أساسي: ${def.labelAr} (${def.code}) — قابل للاستعادة`,
      });
      return NextResponse.json({ ok: true, hidden: def.code });
    }

    // حذف صف مخصص
    if (!id) throw new ApiError("معرف الصف أو كوده مطلوب", 400);
    const existing = await db.customGrade.findUnique({ where: { id } });
    if (!existing || existing.schoolId !== schoolId) throw new ApiError("الصف غير موجود", 404);
    const studentsCount = await db.student.count({ where: { grade: existing.code, schoolId, isActive: true } });
    if (studentsCount > 0) {
      throw new ApiError(`لا يمكن حذف الصف (${existing.nameAr}) لأن فيه ${studentsCount} طالب — انقل الطلبة أولاً`, 400);
    }
    await db.customGrade.delete({ where: { id } });
    await logAudit(user, { action: "DELETE", entity: "CustomGrade", entityId: id, details: `حذف صف: ${existing.nameAr} (${existing.code})` });
    return NextResponse.json({ ok: true });
  } catch (err) {
    return handleApiError(err);
  }
}
