import { desc, eq } from "drizzle-orm";
import { headers } from "next/headers";
import Link from "next/link";
import { redirect } from "next/navigation";
import { auditJob, auditReport, db } from "@/db";
import { auth } from "@/lib/auth";
import { VERDICT_LABEL, verdictOfCounters } from "@/lib/report";

export default async function DashboardPage() {
  const session = await auth.api.getSession({ headers: await headers() });
  if (!session) redirect("/auth");

  const rows = await db
    .select({
      id: auditJob.id,
      origin: auditJob.origin,
      status: auditJob.status,
      error: auditJob.error,
      createdAt: auditJob.createdAt,
      exitCode: auditReport.exitCode,
      blocking: auditReport.blocking,
      warnings: auditReport.warnings,
      checked: auditReport.checked,
    })
    .from(auditJob)
    .leftJoin(auditReport, eq(auditReport.jobId, auditJob.id))
    .where(eq(auditJob.userId, session.user.id))
    .orderBy(desc(auditJob.createdAt))
    .limit(50);

  return (
    <main className="mx-auto w-full max-w-3xl flex-1 px-6 py-16">
      <header className="flex items-baseline justify-between gap-4">
        <h1 className="text-2xl font-semibold tracking-tight text-zinc-900 dark:text-zinc-100">
          Mes audits
        </h1>
        <span className="text-sm text-zinc-500 dark:text-zinc-400">{session.user.email}</span>
      </header>

      {rows.length === 0 ? (
        <p className="mt-10 text-zinc-600 dark:text-zinc-400">
          Aucun audit pour l&apos;instant.{" "}
          <Link href="/" className="underline underline-offset-4">
            Lancez-en un
          </Link>
          .
        </p>
      ) : (
        <ul className="mt-8 divide-y divide-zinc-200 dark:divide-zinc-800">
          {rows.map((row) => {
            const settled = row.exitCode !== null;
            const verdict = settled
              ? verdictOfCounters({
                  exitCode: row.exitCode ?? 0,
                  blocking: row.blocking ?? 0,
                  warnings: row.warnings ?? 0,
                  checked: row.checked ?? 0,
                })
              : null;
            const alarming =
              verdict === "blocking" || verdict === "fatal" || verdict === "unverified";

            const body = (
              <div className="flex items-center justify-between gap-4 py-4">
                <div className="min-w-0">
                  <p className="truncate font-medium text-zinc-900 dark:text-zinc-100">
                    {hostOf(row.origin)}
                  </p>
                  <p className="mt-0.5 text-sm text-zinc-500 dark:text-zinc-400">
                    <time dateTime={row.createdAt.toISOString()}>
                      {row.createdAt.toLocaleDateString("fr-FR", {
                        day: "2-digit",
                        month: "short",
                        year: "numeric",
                      })}
                    </time>
                  </p>
                </div>
                <span
                  className={`shrink-0 text-sm ${
                    alarming
                      ? "text-red-700 dark:text-red-400"
                      : verdict
                        ? "text-emerald-700 dark:text-emerald-400"
                        : "text-zinc-500 dark:text-zinc-400"
                  }`}
                >
                  {verdict ? VERDICT_LABEL[verdict] : statusLabel(row.status, row.error)}
                </span>
              </div>
            );

            return (
              <li key={row.id}>
                {settled ? (
                  <Link
                    href={`/dashboard/${row.id}`}
                    className="block rounded-lg px-2 transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-900"
                  >
                    {body}
                  </Link>
                ) : (
                  <div className="px-2">{body}</div>
                )}
              </li>
            );
          })}
        </ul>
      )}
    </main>
  );
}

function hostOf(origin: string): string {
  try {
    return new URL(origin).host;
  } catch {
    return origin;
  }
}

function statusLabel(status: string, error: string | null): string {
  if (status === "queued") return "En file d'attente";
  if (status === "running") return "En cours";
  if (status === "failed") return error ?? "Échec";
  return status;
}
