import SystemAlert from "@/components/ui/SystemAlert";
import { Suspense } from "react";
import Link from "next/link";
import { notFound, unstable_rethrow } from "next/navigation";
import Loading from "@/components/ui/Loading";
import AulaEvaluacion from "@/components/alumno/AulaEvaluacion";
import { learningContext } from "@/lib/alumno/learning";
import { canTakeAssessment, enabledSessions, isAssessment } from "@/lib/alumno/rules";

type Props = { params: Promise<{ aulaId: string; evaluacionId: string }> };
export default function EvaluacionPage({ params }: Props) {
  return (
    <Suspense fallback={<Loading />}>
      <Evaluation params={params} />
    </Suspense>
  );
}
async function Evaluation({ params }: Props) {
  const { aulaId, evaluacionId } = await params;
  if (!/^[1-9]\d*$/.test(aulaId) || Number(aulaId) > 2147483647) notFound();
  let ctx;
  try {
    ctx = await learningContext(Number(aulaId));
  } catch (e) {
    unstable_rethrow(e);
    notFound();
  }
  const session = enabledSessions(ctx.course).find((s) => s.id === evaluacionId && isAssessment(s));
  if (!session) notFound();
  if (!canTakeAssessment(ctx.course, ctx.progress, session))
    return (
      <main className="flex min-h-dvh items-center justify-center bg-zinc-50 p-6">
        <div className="max-w-md space-y-4">
          <SystemAlert status="warning" title="Continúa primero con tu clase">
            Completa el contenido previo para abrir esta evaluación.
          </SystemAlert>
          <Link
            href={`/aula/${aulaId}?actividad=${encodeURIComponent(session.claseVinculadaId || session.id)}`}
            className="action-link text-sm text-[#9d2449]"
          >
            Volver al aula
          </Link>
        </div>
      </main>
    );
  return (
    <AulaEvaluacion
      aulaId={Number(aulaId)}
      evaluacionId={session.id}
      titulo={session.titulo}
      retornoId={session.claseVinculadaId || session.id}
      total={(session.questions ?? session.preguntas ?? []).length}
      minutos={session.tiempoLimiteMinutos ?? null}
      minima={session.calificacionMinima ?? 70}
    />
  );
}
