import { useEffect, useState, type ReactNode } from "react";
import { Link, useLocation } from "react-router-dom";
import { Building2, Loader2, MapPinOff } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { useAuthAccess } from "@/contexts/AuthAccessContext";
import {
  getEstabelecimentoCodigoFromTransfer,
  lookupUnidadeByEstabelecimento,
} from "@/services/fechamento/unidadeContext";

type GatePhase =
  | "loading"
  | "ready"
  | "sem_codigo_transfer"
  | "unidade_nao_cadastrada"
  | "usuario_outra_unidade";

type UnidadeGateProps = {
  children: ReactNode;
};

function isConfiguracoesPath(pathname: string): boolean {
  return pathname.includes("configuracoes");
}

export function UnidadeGate({ children }: UnidadeGateProps) {
  const { me, papel } = useAuthAccess();
  const location = useLocation();
  const [phase, setPhase] = useState<GatePhase>("loading");
  const [codigoTransfer, setCodigoTransfer] = useState("");

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

    const run = async () => {
      const codigo = getEstabelecimentoCodigoFromTransfer();
      if (!mounted) return;
      setCodigoTransfer(codigo);

      if (!codigo) {
        setPhase("sem_codigo_transfer");
        return;
      }

      try {
        const row = await lookupUnidadeByEstabelecimento(codigo);
        if (!mounted) return;

        if (!row) {
          setPhase("unidade_nao_cadastrada");
          return;
        }

        if (papel !== "admin" && me?.unidadeId && me.unidadeId !== row.id) {
          setPhase("usuario_outra_unidade");
          return;
        }

        setPhase("ready");
      } catch {
        if (!mounted) return;
        setPhase("unidade_nao_cadastrada");
      }
    };

    void run();
    return () => {
      mounted = false;
    };
  }, [me?.unidadeId, location.pathname, papel]);

  const isAdmin = papel === "admin";
  const onConfiguracoes = isConfiguracoesPath(location.pathname);

  if (phase === "loading") {
    return (
      <div className="flex min-h-screen items-center justify-center bg-background">
        <div className="flex flex-col items-center gap-3">
          <Loader2 className="h-8 w-8 animate-spin text-primary" />
          <p className="text-sm text-muted-foreground">Verificando unidade do estabelecimento...</p>
        </div>
      </div>
    );
  }

  if (phase === "ready") {
    return <>{children}</>;
  }

  if (phase === "unidade_nao_cadastrada" && isAdmin && onConfiguracoes) {
    return <>{children}</>;
  }

  if (phase === "sem_codigo_transfer") {
    return (
      <div className="flex min-h-screen items-center justify-center bg-background p-4">
        <Card className="w-full max-w-lg">
          <CardHeader className="text-center">
            <div className="mb-2 flex justify-center">
              <MapPinOff className="h-10 w-10 text-muted-foreground" />
            </div>
            <CardTitle>Estabelecimento não identificado</CardTitle>
          </CardHeader>
          <CardContent className="space-y-4 text-center text-muted-foreground">
            <p>
              O código do estabelecimento não foi enviado pelo ambiente (TransferArea). Abra o módulo
              Fechamento HGTX a partir do Codex com o estabelecimento carregado no transfer.
            </p>
          </CardContent>
        </Card>
      </div>
    );
  }

  if (phase === "unidade_nao_cadastrada") {
    return (
      <div className="flex min-h-screen items-center justify-center bg-background p-4">
        <Card className="w-full max-w-lg">
          <CardHeader className="text-center">
            <div className="mb-2 flex justify-center">
              <Building2 className="h-10 w-10 text-primary" />
            </div>
            <CardTitle>Unidade ainda não cadastrada</CardTitle>
          </CardHeader>
          <CardContent className="space-y-4 text-center">
            <p className="text-muted-foreground">
              Não existe unidade no Commander para o estabelecimento{" "}
              <span className="font-mono text-foreground">{codigoTransfer || "—"}</span>.
            </p>
            {isAdmin ? (
              <>
                <p className="text-sm text-muted-foreground">
                  Cadastre o nome da unidade em Configurações (integração com o código atual do transfer).
                </p>
                <Button asChild>
                  <Link to="/fechamento/configuracoes#unidade">Ir para Configurações</Link>
                </Button>
              </>
            ) : (
              <p className="text-sm text-muted-foreground">
                Peça a um administrador para cadastrar a unidade deste estabelecimento no Commander. Informe o
                código: <span className="font-mono text-foreground">{codigoTransfer}</span>
              </p>
            )}
          </CardContent>
        </Card>
      </div>
    );
  }

  if (phase === "usuario_outra_unidade") {
    return (
      <div className="flex min-h-screen items-center justify-center bg-background p-4">
        <Card className="w-full max-w-lg">
          <CardHeader className="text-center">
            <CardTitle>Estabelecimento diferente do seu cadastro</CardTitle>
          </CardHeader>
          <CardContent className="space-y-4 text-center text-muted-foreground">
            <p>
              Você está vinculado a outra unidade no Commander do que o estabelecimento aberto neste contexto
              (código <span className="font-mono text-foreground">{codigoTransfer}</span>).
            </p>
            <p className="text-sm">
              Abra o módulo com o estabelecimento correspondente ao seu usuário ou solicite ajuste ao
              administrador.
            </p>
          </CardContent>
        </Card>
      </div>
    );
  }

  return <>{children}</>;
}
