import Link from "next/link";
import { PageShell } from "@/components/app/page-shell";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader } from "@/components/ui/card";
import { consumeEmailVerificationToken } from "@/lib/auth/verification";
import { getCurrentUser } from "@/lib/auth/user";

type VerifyPageProps = {
  searchParams: Promise<Record<string, string | string[] | undefined>>;
};

function getParam(params: Record<string, string | string[] | undefined>, key: string) {
  const value = params[key];
  return Array.isArray(value) ? value[0] : value;
}

export default async function VerifyPage({ searchParams }: VerifyPageProps) {
  const currentUser = await getCurrentUser();

  const params = await searchParams;
  const token = getParam(params, "token");
  const initialEmail = getParam(params, "email") ?? "";
  const verificationLinkSent = getParam(params, "sent") === "1";
  const wasUnverifiedOnLogin = getParam(params, "unverified") === "1";
  const hasMissingEmailError = getParam(params, "error") === "missing_email";
  const hasEmailDeliveryError = getParam(params, "error") === "email_delivery_failed";
  const hasServerError = getParam(params, "error") === "server_error";

  let status: "pending" | "verified" | "invalid" = "pending";
  let resolvedEmail = initialEmail;

  if (token) {
    try {
      const verificationResult = await consumeEmailVerificationToken(token);

      if (verificationResult.status === "verified") {
        status = "verified";
        resolvedEmail = verificationResult.email ?? resolvedEmail;
      } else {
        status = "invalid";
      }
    } catch {
      status = "invalid";
    }
  }

  return (
    <PageShell title="Verificar Correo" description="Confirma tu direccion de correo para activar la cuenta.">
      <Card className="mx-auto w-full max-w-xl">
        <CardHeader>
          {status === "verified" ? (
            <Badge variant="success" className="w-fit">
              Correo verificado
            </Badge>
          ) : status === "invalid" ? (
            <Badge variant="warning" className="w-fit">
              Enlace invalido o expirado
            </Badge>
          ) : (
            <Badge variant="neutral" className="w-fit">
              Verificacion pendiente
            </Badge>
          )}

          <h2 className="text-xl font-semibold text-[#1f2a40]">
            {status === "verified"
              ? "Tu cuenta fue activada"
              : status === "invalid"
                ? "No pudimos validar el enlace"
                : "Revisa tu bandeja de entrada"}
          </h2>
        </CardHeader>
        <CardContent className="space-y-4">
          {status === "verified" ? (
            <p className="text-sm text-[#64718a]">
              {resolvedEmail ? `El correo ${resolvedEmail} fue verificado.` : "Tu correo fue verificado."} Ya puedes iniciar sesion.
            </p>
          ) : status === "invalid" ? (
            <p className="text-sm text-[#64718a]">
              El enlace de verificacion no es valido o ya expiro. Solicita un nuevo enlace para continuar.
            </p>
          ) : (
            <p className="text-sm text-[#64718a]">
              Enviaremos un enlace de verificacion para activar tu cuenta. En modo desarrollo, el enlace se imprime en consola del servidor.
            </p>
          )}

          {wasUnverifiedOnLogin ? (
            <p className="rounded-lg border border-[#fff1c2] bg-[#fff8e5] px-3 py-2 text-sm text-[#8a6500]">
              Tu cuenta existe, pero aun no esta verificada. Te enviamos un nuevo enlace.
            </p>
          ) : null}

          {verificationLinkSent ? (
            <p className="rounded-lg border border-[#ccead8] bg-[#ebf8f0] px-3 py-2 text-sm text-[#206546]">
              Enlace de verificacion enviado {resolvedEmail ? `a ${resolvedEmail}` : ""}.
            </p>
          ) : null}

          {hasEmailDeliveryError ? (
            <p className="rounded-lg border border-[#fff1c2] bg-[#fff8e5] px-3 py-2 text-sm text-[#8a6500]">
              La cuenta fue creada, pero no pudimos enviar el correo de verificacion. Revisa la configuracion SMTP e intenta reenviar.
            </p>
          ) : null}

          {hasMissingEmailError ? (
            <p className="rounded-lg border border-[#f6d0d0] bg-[#fff3f3] px-3 py-2 text-sm text-[#9d3030]">
              Debes indicar un correo para reenviar la verificacion.
            </p>
          ) : null}

          {hasServerError ? (
            <p className="rounded-lg border border-[#f6d0d0] bg-[#fff3f3] px-3 py-2 text-sm text-[#9d3030]">
              Ocurrio un error al procesar la verificacion. Intenta nuevamente.
            </p>
          ) : null}

          <div className="flex flex-wrap gap-2">
            {status === "verified" ? (
              currentUser ? (
                <Link href="/dashboard">
                  <Button>Ir al dashboard</Button>
                </Link>
              ) : (
                <Link href="/login">
                  <Button>Iniciar sesion</Button>
                </Link>
              )
            ) : (
              <form action="/api/auth/resend" method="post">
                <input type="hidden" name="email" value={resolvedEmail} />
                <Button type="submit" disabled={!resolvedEmail}>
                  Reenviar enlace
                </Button>
              </form>
            )}

            <Link href="/login">
              <Button variant="secondary">Volver a login</Button>
            </Link>
          </div>
        </CardContent>
      </Card>
    </PageShell>
  );
}
