import Link from "next/link";
import { Card } from "@heroui/react";
import { getContenidoAlumno } from "@/lib/data/contenido-alumno";
import { getAulaAccess } from "@/lib/aula/access";
import { getLearningState } from "@/lib/alumno/learning";
import { getGestionAula } from "@/lib/data/aula";
import { loadCourse, onlineRevision } from "@/lib/aula/persistence";
import { sectionLabels } from "@/lib/dashboard-navigation";
import TaskDialog from "./TaskDialog";
import ResourceLink from "@/components/ui/ResourceLink";
import AulaForum from "./aula/AulaForum";
import DashboardAulaForm from "./DashboardAulaForm";
import DashboardAlumnoRecorrido from "./DashboardAlumnoRecorrido";

export default async function AulaSectionContent({
  id,
  title,
  code,
  section,
  role,
}: {
  id: number;
  title: string;
  code: string;
  section: keyof typeof sectionLabels;
  role: "alumno" | "instructor";
}) {
  const linkClass = "action-link text-sm";
  let content;
  if (role === "instructor") {
    const { online, instructorId, aula } = await getGestionAula(String(id));
    const document = loadCourse(online).document;
    const tab = {
      videoclases: "videos",
      materiales: "material",
      evaluaciones: "evaluaciones",
      foros: "foro",
      "mis-tareas": "tareas",
    }[section];
    if (section === "foros" && document.componentes.foro)
      return (
        <AulaForum
          aulaId={id}
          tasks={document.sesiones
            .filter((s) => s.tipo === "tarea")
            .map((s) => ({ id: s.id, titulo: s.titulo }))}
          materials={document.materiales.map((m) => ({ id: m.id, titulo: m.titulo }))}
        />
      );
    return (
      <DashboardAulaForm
        key={id + ":" + tab}
        initialTab={tab}
        aulaId={id}
        instructorId={instructorId}
        titulo={title}
        horas={Number(aula.aul_horas_totales ?? 0)}
        initial={document}
        version={onlineRevision(online)}
      />
    );
  } else {
    const data = await getContenidoAlumno(id);
    if (!data || data.estado !== "disponible")
      content = (
        <p className="text-sm text-zinc-500">
          {data?.estado === "sin_publicar"
            ? "El contenido aún no se ha publicado."
            : "No fue posible consultar el contenido."}
        </p>
      );
    else if (section === "videoclases") {
      const progress = await getLearningState(id);
      return (
        <DashboardAlumnoRecorrido
          aulaId={id}
          enrollmentId={progress.enrollmentId}
          initialProgress={progress}
          content={data}
        />
      );
    } else if (section === "mis-tareas")
      content = data.tareas.length ? (
        <>
          <p className="text-xs text-zinc-500">{data.tareas.length} tareas asignadas</p>
          <TaskDialog aulaId={id} label="Ver mis tareas" />
        </>
      ) : (
        <p className="text-sm text-zinc-500">No hay tareas publicadas.</p>
      );
    else if (section === "materiales")
      content = data.materiales.length ? (
        <ul className="divide-y divide-zinc-100">
          {data.materiales.map((m) => (
            <li key={m.id} className="space-y-1 py-3">
              {m.url ? (
                <ResourceLink url={m.url} title={m.titulo} />
              ) : (
                <p className="text-sm">{m.titulo}</p>
              )}
              <p className="text-xs text-zinc-400">{m.categoria}</p>
            </li>
          ))}
        </ul>
      ) : (
        <p className="text-sm text-zinc-500">No hay materiales publicados.</p>
      );
    else if (section === "foros") {
      if (data.foroActivo) {
        const { course } = await getAulaAccess(id);
        return (
          <AulaForum
            aulaId={id}
            tasks={data.tareas.map((t) => ({ id: t.id, titulo: t.titulo }))}
            materials={
              course.componentes.material
                ? course.materiales.map((m) => ({ id: m.id, titulo: m.titulo }))
                : []
            }
          />
        );
      }
      content = <p className="text-sm text-zinc-500">El foro no está habilitado.</p>;
    } else {
      const items = data.evaluaciones;
      content = items.length ? (
        <ul className="divide-y divide-zinc-100">
          {items.map((item) => (
            <li key={item.id} className="py-3">
              <Link
                className={linkClass}
                href={`/aula/${id}?actividad=${encodeURIComponent(item.id)}`}
              >
                {item.titulo}
              </Link>
            </li>
          ))}
        </ul>
      ) : (
        <p className="text-sm text-zinc-500">
          No hay {sectionLabels[section].toLocaleLowerCase()} publicadas.
        </p>
      );
    }
  }
  return (
    <Card className="min-w-0 gap-4 border border-zinc-200 p-5 shadow-none">
      <Card.Header className="p-0">
        <Card.Title className="text-base">{title}</Card.Title>
        <Card.Description>{code}</Card.Description>
      </Card.Header>
      <Card.Content className="space-y-3 p-0">{content}</Card.Content>
    </Card>
  );
}
