"use client";

import { useParams, useRouter, useSearchParams } from "next/navigation";
import { useCallback, useEffect, useState } from "react";
import { Alert } from "@/components/ui/Alert";
import { PageContentSkeleton } from "@/components/ui/Skeleton";
import {
  ClassWorkspaceTabs,
  type WorkspaceTab,
} from "@/components/teacher/ClassWorkspaceTabs";
import { TeacherShell } from "@/components/teacher/TeacherShell";
import { ApiError, apiGet } from "@/lib/api";

interface OverviewResponse {
  class_room: {
    id: number;
    name: string;
    code?: string | null;
    grade_label?: string | null;
  };
  subject?: {
    id: number;
    name: string;
    image_url?: string | null;
  } | null;
  students_count: number;
  students: Array<{
    enrollment_id: number;
    student_profile_id?: number | null;
    student_code?: string | null;
    first_name?: string | null;
    last_name?: string | null;
  }>;
}

const VALID_TABS = new Set<WorkspaceTab>([
  "schedule",
  "exams",
  "students",
  "attendance",
  "grades",
  "classlog",
  "resources",
  "assignments",
  "reports",
]);

export default function TeacherClassWorkspacePage() {
  const { classId } = useParams<{ classId: string }>();
  const router = useRouter();
  const searchParams = useSearchParams();
  const subjectId = searchParams.get("subject_id");
  const scheduleId = searchParams.get("schedule_id");
  const dateParam = searchParams.get("date");
  const deliveryMode = searchParams.get("delivery_mode");
  const tabParam = searchParams.get("tab") as WorkspaceTab | null;

  const classRoomId = Number(classId);
  const [overview, setOverview] = useState<OverviewResponse | null>(null);
  const [activeTab, setActiveTab] = useState<WorkspaceTab>(
    tabParam && VALID_TABS.has(tabParam) ? tabParam : "students",
  );
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    if (tabParam && VALID_TABS.has(tabParam)) setActiveTab(tabParam);
  }, [tabParam]);

  const handleTabChange = (tab: WorkspaceTab) => {
    setActiveTab(tab);
    const params = new URLSearchParams(searchParams.toString());
    params.set("tab", tab);
    router.replace(`/teacher/classes/${classRoomId}?${params.toString()}`, { scroll: false });
  };

  const load = useCallback(async () => {
    setLoading(true);
    setError(null);
    try {
      const params = new URLSearchParams();
      if (subjectId) params.set("subject_id", subjectId);
      const data = await apiGet<OverviewResponse>(
        `/teacher/classes/${classRoomId}/overview?${params.toString()}`,
      );
      setOverview(data);
    } catch (err) {
      setError(err instanceof ApiError ? err.message : "خطا");
    } finally {
      setLoading(false);
    }
  }, [classRoomId, subjectId]);

  useEffect(() => {
    void load();
  }, [load]);

  useEffect(() => {
    if (!overview?.subject?.id || subjectId) return;
    const params = new URLSearchParams(searchParams.toString());
    params.set("subject_id", String(overview.subject.id));
    router.replace(`/teacher/classes/${classRoomId}?${params.toString()}`, { scroll: false });
  }, [overview?.subject?.id, subjectId, classRoomId, router, searchParams]);

  return (
    <TeacherShell
      title="داشبورد معلم"
      subtitle="مدیریت کلاس"
      showBack
      breadcrumbLabels={{
        class: overview?.class_room.name,
        detail: overview?.class_room.grade_label || overview?.class_room.code,
      }}
    >
      {error ? <Alert tone="error">{error}</Alert> : null}
      {loading ? (
        <PageContentSkeleton rows={6} />
      ) : overview ? (
        <ClassWorkspaceTabs
          activeTab={activeTab}
          onTabChange={handleTabChange}
          classRoomId={classRoomId}
          subjectId={subjectId ? Number(subjectId) : overview.subject?.id ?? null}
          scheduleId={scheduleId ? Number(scheduleId) : null}
          students={overview.students}
          attendanceDate={dateParam ?? undefined}
          deliveryMode={deliveryMode}
          overview={{
            code: overview.class_room.code ?? overview.class_room.name,
            grade_label: overview.class_room.grade_label,
            students_count: overview.students_count,
          }}
          subject={overview.subject}
        />
      ) : null}
    </TeacherShell>
  );
}
