"use client";

import { useEffect } from "react";
import { useRouter, useSearchParams } from "next/navigation";
import { createClient as createSupabaseClient } from "@supabase/supabase-js";
import { origemDaLoja } from "@/lib/passagem-do-login";

/* Loja em dominio proprio: o erro volta para a tela de entrar de la, e nao
   para a do endereco principal, longe do carrinho. */
function buildLoginUrl(slug: string, next: string, error?: string, origem?: string | null) {
  const fallbackSlug = slug || "";
  const url = new URL(`/${fallbackSlug}/cliente/login`, origem || window.location.origin);
  if (next) url.searchParams.set("next", next);
  if (error) url.searchParams.set("error", error);
  return url.toString();
}

function createPortalOAuthClient() {
  const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
  const anon = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;

  if (!url || !anon) {
    throw new Error("Supabase env vars are missing.");
  }

  return createSupabaseClient(url, anon, {
    auth: {
      flowType: "implicit",
      autoRefreshToken: false,
      persistSession: false,
      detectSessionInUrl: false,
    },
  });
}

export default function ClientPortalGoogleCallbackClient() {
  const router = useRouter();
  const searchParams = useSearchParams();

  useEffect(() => {
    let active = true;

    async function run() {
      const slug = String(searchParams.get("slug") || "").trim();
      const next = String(searchParams.get("next") || "").trim();
      /* De onde o cliente saiu (loja em dominio proprio) e o vinculo com o
         navegador dele: vao para o servidor montar a passagem de volta. */
      const origem = origemDaLoja(searchParams.get("origem"))?.origem || null;
      const vinculo = String(searchParams.get("vinculo") || "").trim();
      const code = searchParams.get("code");
      const error = searchParams.get("error");
      const errorDescription = searchParams.get("error_description");
      const hash = typeof window !== "undefined" ? window.location.hash : "";
      const hashParams = new URLSearchParams(hash.startsWith("#") ? hash.slice(1) : hash);
      const accessTokenFromHash = hashParams.get("access_token");
      const errorFromHash = hashParams.get("error");
      const errorDescriptionFromHash = hashParams.get("error_description");

      if (!slug) {
        router.replace("/");
        return;
      }

      if (error || errorFromHash) {
        window.location.assign(
          buildLoginUrl(
            slug,
            next,
            errorDescriptionFromHash || errorDescription || "Não foi possível concluir o login com Google.",
            origem
          )
        );
        return;
      }

      try {
        const oauthClient = createPortalOAuthClient();
        let accessToken = accessTokenFromHash || "";

        if (!accessToken && code) {
          const { data: exchangeData, error: exchangeError } = await oauthClient.auth.exchangeCodeForSession(code);
          if (exchangeError) {
            throw new Error(exchangeError.message || "Não foi possível validar sua conta Google.");
          }
          accessToken = exchangeData.session?.access_token || "";
        }

        if (!accessToken) {
          throw new Error("Não foi possível validar sua conta Google.");
        }

        const response = await fetch("/api/client-portal/google-login", {
          method: "POST",
          headers: { "content-type": "application/json" },
          body: JSON.stringify({
            slug,
            access_token: accessToken,
            next,
            origem,
            vinculo,
          }),
        });

        const payload = (await response.json()) as { error?: string; redirect_url?: string };
        if (!response.ok || payload.error || !payload.redirect_url) {
          throw new Error(
            payload.error ||
              "Seu Google não está vinculado a um cliente ativo desta loja. Peça para a loja cadastrar esse e-mail no seu cliente."
          );
        }

        if (!active) return;
        window.location.assign(payload.redirect_url);
      } catch (err) {
        const message =
          typeof err === "object" && err && "message" in err && typeof err.message === "string"
            ? err.message
            : "Falha ao concluir login com Google.";
        if (!active) return;
        window.location.assign(buildLoginUrl(slug, next, message, origem));
      }
    }

    run();

    return () => {
      active = false;
    };
  }, [router, searchParams]);

  return (
    <div className="flex min-h-screen items-center justify-center bg-white px-4">
      <div className="text-center">
        <div className="text-base font-semibold text-zinc-900">Concluindo login com Google...</div>
        <div className="mt-2 text-sm text-zinc-500">Aguarde enquanto validamos sua conta.</div>
      </div>
    </div>
  );
}
