"use client";

/** سياق الهيكل الدراسي: الصفوف (الأساسية غير المخفية + المضافة) والشعب — يُغذي جميع الصفحات */
import { createContext, useCallback, useContext, useEffect, useState } from "react";
import { apiFetch, GRADE_LABELS } from "@/lib/client-utils";

export interface CustomGradeDTO {
  id: string;
  code: string;
  nameAr: string;
}

export interface ClassroomDTO {
  id: string;
  name: string;
  studentsCount: number;
}

interface StructureValue {
  /** القائمة الكاملة للصفوف الظاهرة: الأساسية غير المخفية ثم المخصصة */
  grades: { code: string; labelAr: string; isCustom: boolean; id?: string }[];
  /** أكواد الصفوف الأساسية المخفية من قبل المدير (قابلة للاستعادة) */
  hiddenBuiltIn: { code: string; labelAr: string }[];
  /** خريطة مسميات العرض (أساسي + مخصص) */
  customLabels: Record<string, string>;
  classrooms: ClassroomDTO[];
  reload: () => void;
}

const StructureContext = createContext<StructureValue>({
  grades: [],
  hiddenBuiltIn: [],
  customLabels: {},
  classrooms: [],
  reload: () => {},
});

export function StructureProvider({ children }: { children: React.ReactNode }) {
  const [customGrades, setCustomGrades] = useState<CustomGradeDTO[]>([]);
  const [hiddenCodes, setHiddenCodes] = useState<string[]>([]);
  const [classrooms, setClassrooms] = useState<ClassroomDTO[]>([]);

  const load = useCallback(async () => {
    try {
      const [g, c] = await Promise.all([
        apiFetch<{ grades: CustomGradeDTO[]; hiddenGrades?: string[] }>("/api/custom-grades"),
        apiFetch<{ classrooms: ClassroomDTO[] }>("/api/classrooms"),
      ]);
      setCustomGrades(g.grades);
      setHiddenCodes(g.hiddenGrades ?? []);
      setClassrooms(c.classrooms);
    } catch {
      /* تجاهل - القيم الافتراضية كافية */
    }
  }, []);

  useEffect(() => {
    // eslint-disable-next-line react-hooks/set-state-in-effect
    load();
  }, [load]);

  const customLabels: Record<string, string> = {};
  for (const g of customGrades) customLabels[g.code] = g.nameAr;

  const hiddenBuiltIn = Object.entries(GRADE_LABELS)
    .filter(([code]) => hiddenCodes.includes(code))
    .map(([code, labelAr]) => ({ code, labelAr }));

  const grades = [
    ...Object.entries(GRADE_LABELS)
      .filter(([code]) => !hiddenCodes.includes(code))
      .map(([code, labelAr]) => ({ code, labelAr, isCustom: false })),
    ...customGrades.map((g) => ({ code: g.code, labelAr: g.nameAr, isCustom: true, id: g.id })),
  ];

  return (
    <StructureContext.Provider value={{ grades, hiddenBuiltIn, customLabels, classrooms, reload: load }}>
      {children}
    </StructureContext.Provider>
  );
}

export function useStructure() {
  return useContext(StructureContext);
}
