"use client";

import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useRouter } from "next/navigation";
import { PageHeader } from "@/components/ui/page-header";
import { Button } from "@/components/ui/button";
import { usePermissoes } from "@/lib/permissoes-do-usuario";
import { Input } from "@/components/ui/input";
import { Checkbox } from "@/components/ui/checkbox";
import { CustomSelect } from "@/components/ui/custom-select";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import { SponsoredBannersCarousel } from "@/components/sponsored-banners-carousel";
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
} from "@/components/ui/dialog";
import {
  AlertCircle,
  ArrowDown,
  ArrowUp,
  BadgeCheck,
  Building2,
  CheckCircle2,
  Loader2,
  Clock3,
  CreditCard,
  Eye,
  ExternalLink,
  FileUp,
  Filter,
  Globe,
  History,
  Mail,
  MapPin,
  MessageCircle,
  MoreHorizontal,
  Package,
  Phone,
  Plus,
  ReceiptText,
  Search,
  ShieldCheck,
  Sparkles,
  Trash2,
  Wallet,
} from "lucide-react";
import { twMerge } from "tailwind-merge";
import { Aviso } from "@/components/ui/aviso";
import {
  conferirFornecedor,
  formatarDocumento,
  formatarTelefone,
  documentoValido,
  apenasDigitos,
  tipoDoDocumento,
  type Recusa,
} from "@/lib/fornecedores/documento";

type SupplierStatus = "ativo" | "pendente" | "inativo";

type SupplierRow = {
  id: string;
  name: string;
  cnpj: string;
  documentType?: "cnpj" | "cpf";
  categoryId?: string | null;
  category: string;
  city: string;
  email: string;
  phone: string;
  paymentTermsPrimary: string;
  paymentTermsSecondary: string;
  openBillsTotal: number;
  openBillsCount: number;
  status: SupplierStatus;
  notes?: string | null;
  createdAt?: string | null;
  updatedAt?: string | null;
};

type SponsoredSupplierRow = {
  id: string;
  name: string;
  legalName?: string | null;
  cnpj: string;
  category?: string | null;
  city?: string | null;
  email: string;
  phone: string;
  paymentTermsPrimary: string;
  paymentTermsSecondary: string;
  subscriberDiscount?: string | null;
  imageUrl?: string | null;
  description?: string | null;
  websiteUrl?: string | null;
  notes?: string | null;
  active: boolean;
  position: number;
  createdAt?: string | null;
  updatedAt?: string | null;
};

type SupplierDraft = {
  name: string;
  cnpj: string;
  category: string;
  city: string;
  email: string;
  phone: string;
  paymentTermsPrimary: string;
  paymentTermsSecondary: string;
  status: SupplierStatus;
  notes: string;
};

const kPurple = "#4f46e5";
const PAGE_SIZE = 5;

const COMMON_CITIES = [
  "São Paulo",
  "Campinas",
  "Guarulhos",
  "Barueri",
  "Santo André",
  "Osasco",
  "Santos",
  "São Bernardo do Campo",
];

const PAYMENT_PRIMARY_OPTIONS = [
  { value: "À vista", label: "À vista" },
  { value: "14 dias", label: "14 dias" },
  { value: "15 dias", label: "15 dias" },
  { value: "28 dias", label: "28 dias" },
  { value: "30 dias", label: "30 dias" },
  { value: "30/60 dias", label: "30/60 dias" },
  { value: "15/30 dias", label: "15/30 dias" },
  { value: "15/30/45 dias", label: "15/30/45 dias" },
  { value: "60 dias", label: "60 dias" },
];

const PAYMENT_SECONDARY_OPTIONS = [
  { value: "Boleto", label: "Boleto" },
  { value: "PIX", label: "PIX" },
  { value: "Boleto/PIX", label: "Boleto/PIX" },
  { value: "PIX / boleto", label: "PIX / boleto" },
  { value: "Cartão", label: "Cartão" },
];

const DEFAULT_DRAFT: SupplierDraft = {
  name: "",
  cnpj: "",
  category: "",
  /* Era "São Paulo" fixo. Como o campo nao e obrigatorio e a consulta pelo CNPJ
     preenche a cidade certa sozinha, chutar era so gravar errado para quem esta
     em outro estado. */
  city: "",
  email: "",
  phone: "",
  paymentTermsPrimary: "30 dias",
  paymentTermsSecondary: "Boleto",
  status: "ativo",
  notes: "",
};

const money = (value: number) =>
  new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL" }).format(value);

/* As tres viraram apelidos da biblioteca compartilhada, que a rota tambem usa.
   O nome antigo continua porque a tela chama `formatCnpj` em uma duzia de
   lugares; o que muda e que agora ela acerta a mascara do CPF tambem. */
const digits = apenasDigitos;
const formatPhone = formatarTelefone;
const formatCnpj = formatarDocumento;

function rotuloDoDocumento(valor: string) {
  const total = digits(valor).length;
  if (total === 0) return "CNPJ ou CPF";
  return tipoDoDocumento(valor) === "cpf" ? "CPF" : "CNPJ";
}

function getInitials(name: string) {
  const parts = String(name || "")
    .trim()
    .split(/\s+/)
    .filter(Boolean);
  const first = parts[0]?.[0] || "";
  const second = parts.length > 1 ? parts[1]?.[0] || "" : parts[0]?.[1] || "";
  return `${first}${second}`.toUpperCase();
}

function SupplierAvatar({
  name,
  imageUrl,
  className = "h-14 w-14 rounded-2xl",
  textClassName = "text-sm",
}: {
  name: string;
  imageUrl?: string | null;
  className?: string;
  textClassName?: string;
}) {
  const [imageError, setImageError] = useState(false);

  if (imageUrl && !imageError) {
    return (
      <img
        src={imageUrl}
        alt={name}
        onError={() => setImageError(true)}
        className={twMerge("shrink-0 object-cover ring-1 ring-slate-200", className)}
      />
    );
  }

  return (
    <div
      className={twMerge(
        "flex shrink-0 items-center justify-center border border-slate-200 bg-[rgba(79,70,229,0.06)] font-semibold text-slate-700",
        className,
        textClassName
      )}
    >
      {getInitials(name)}
    </div>
  );
}

function normalizeWebsiteHref(value?: string | null) {
  const raw = String(value || "").trim();
  if (!raw) return "";
  return /^https?:\/\//i.test(raw) ? raw : `https://${raw}`;
}

function formatWebsiteLabel(value?: string | null) {
  const href = normalizeWebsiteHref(value);
  if (!href) return "";
  try {
    return new URL(href).hostname.replace(/^www\./i, "");
  } catch {
    return String(value || "").replace(/^https?:\/\//i, "").replace(/^www\./i, "");
  }
}

function buildWhatsappHref(phone: string) {
  const value = digits(phone);
  return value ? `https://wa.me/55${value}` : "";
}

function statusBadge(status: SupplierStatus) {
  if (status === "ativo") return "border-emerald-200 bg-emerald-50 text-emerald-700";
  if (status === "pendente") return "border-amber-200 bg-amber-50 text-amber-800";
  return "border-slate-200 bg-slate-50 text-slate-600";
}

function SponsoredOfferBadge({
  value,
  compact = false,
}: {
  value: string;
  compact?: boolean;
}) {
  return (
    <TooltipProvider delayDuration={180}>
      <Tooltip>
        <TooltipTrigger asChild>
          <div
            className={twMerge(
              "group relative inline-flex cursor-help items-center gap-2 overflow-hidden rounded-full border border-fuchsia-200 bg-[linear-gradient(135deg,rgba(236,72,153,0.14)_0%,rgba(124,58,237,0.14)_100%)] text-fuchsia-700 shadow-[0_8px_30px_rgba(168,85,247,0.12)] transition hover:scale-[1.02]",
              compact ? "px-3 py-1.5 text-xs font-semibold" : "px-4 py-2 text-sm font-semibold"
            )}
          >
            <span className="absolute inset-0 animate-pulse bg-[radial-gradient(circle_at_left,rgba(255,255,255,0.30),transparent_45%)] opacity-80" />
            <span className="relative flex h-5 w-5 items-center justify-center rounded-full bg-white/85 text-fuchsia-600">
              <Sparkles className="h-3.5 w-3.5" />
            </span>
            <span className="relative uppercase tracking-[0.12em] text-[10px] text-fuchsia-500">Oferta Ktalogu</span>
            <span className="relative whitespace-nowrap text-fuchsia-800">{value}</span>
          </div>
        </TooltipTrigger>
        <TooltipContent className="max-w-[260px] text-sm">
          Essa oferta é válida apenas para assinantes Ktalogu.
        </TooltipContent>
      </Tooltip>
    </TooltipProvider>
  );
}

function sortByRecency(a?: string | null, b?: string | null) {
  const timeA = a ? new Date(a).getTime() : 0;
  const timeB = b ? new Date(b).getTime() : 0;
  return timeB - timeA;
}

function ActionMenu({
  onEdit,
  onView,
  onPurchases,
  onPayables,
  onHistory,
  onDelete,
  podeExcluir,
}: {
  onEdit: () => void;
  onView: () => void;
  onPurchases: () => void;
  onPayables: () => void;
  onHistory: () => void;
  onDelete: () => void;
  podeExcluir: boolean;
}) {
  const [open, setOpen] = useState(false);
  const buttonRef = useRef<HTMLButtonElement | null>(null);
  const menuRef = useRef<HTMLDivElement | null>(null);
  const [coords, setCoords] = useState<{ top: number; left: number; width: number } | null>(null);

  useEffect(() => {
    if (!open) return;
    const handlePointer = (event: MouseEvent) => {
      const target = event.target as Node | null;
      if (menuRef.current?.contains(target || null)) return;
      if (buttonRef.current?.contains(target || null)) return;
      setOpen(false);
    };
    window.addEventListener("mousedown", handlePointer);
    return () => window.removeEventListener("mousedown", handlePointer);
  }, [open]);

  useEffect(() => {
    if (!open) return;
    const updatePosition = () => {
      const rect = buttonRef.current?.getBoundingClientRect();
      if (!rect) return;
      const width = 244;
      const margin = 12;
      const left = Math.min(window.innerWidth - margin - width, Math.max(margin, rect.right - width));
      setCoords({ top: rect.bottom + 8, left, width });
    };
    updatePosition();
    window.addEventListener("resize", updatePosition);
    window.addEventListener("scroll", updatePosition, true);
    return () => {
      window.removeEventListener("resize", updatePosition);
      window.removeEventListener("scroll", updatePosition, true);
    };
  }, [open]);

  return (
    <>
      <button
        ref={buttonRef}
        type="button"
        onClick={() => setOpen((prev) => !prev)}
        className="inline-flex h-9 w-9 items-center justify-center rounded-md border border-slate-200 bg-white text-slate-700 transition hover:bg-slate-50"
      >
        <MoreHorizontal className="h-4.5 w-4.5" />
      </button>

      {open && coords ? (
        <div
          ref={menuRef}
          className="fixed z-50 overflow-hidden rounded-xl border border-slate-200 bg-white shadow-[0_18px_50px_rgba(15,23,42,0.10)]"
          style={{ top: coords.top, left: coords.left, width: coords.width }}
        >
          <div className="border-b border-slate-100 px-3 py-2 text-[11px] font-semibold uppercase tracking-[0.12em] text-slate-500">
            Ações
          </div>
          <div className="p-1">
            {[
              { label: "Editar", icon: <Building2 className="h-4 w-4" />, onClick: onEdit },
              { label: "Visualizar", icon: <ReceiptText className="h-4 w-4" />, onClick: onView },
              { label: "Compras", icon: <Package className="h-4 w-4" />, onClick: onPurchases },
              { label: "Contas a pagar", icon: <Wallet className="h-4 w-4" />, onClick: onPayables },
              { label: "Histórico", icon: <History className="h-4 w-4" />, onClick: onHistory },
            ].map((item) => (
              <button
                key={item.label}
                type="button"
                onClick={() => {
                  setOpen(false);
                  item.onClick();
                }}
                className="flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-sm text-slate-700 transition hover:bg-slate-50"
              >
                <span className="text-slate-500">{item.icon}</span>
                <span className="flex-1 text-left">{item.label}</span>
              </button>
            ))}
            {podeExcluir && (
            <>
            <div className="my-1 h-px bg-slate-100" />
            <button
              type="button"
              onClick={() => {
                setOpen(false);
                onDelete();
              }}
              className="flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-sm text-rose-600 transition hover:bg-rose-50"
            >
              <span className="text-rose-500">
                <Trash2 className="h-4 w-4" />
              </span>
              <span className="flex-1 text-left">Deletar</span>
            </button>
            </>
            )}
          </div>
        </div>
      ) : null}
    </>
  );
}

function SupplierFormDialog({
  open,
  onOpenChange,
  title,
  description,
  submitLabel,
  loading,
  error,
  initial,
  categoryHints,
  cityHints,
  onSubmit,
}: {
  open: boolean;
  onOpenChange: (value: boolean) => void;
  title: string;
  description: string;
  submitLabel: string;
  loading: boolean;
  error: string | null;
  initial: SupplierRow | null;
  categoryHints: string[];
  cityHints: string[];
  onSubmit: (draft: SupplierDraft) => Promise<void>;
}) {
  const [form, setForm] = useState<SupplierDraft>(DEFAULT_DRAFT);
  /* O que a checagem recusou. Substitui o botao cinza sem explicacao: agora o
     botao sempre responde e o problema aparece escrito, no campo certo. */
  const [recusa, setRecusa] = useState<Recusa | null>(null);
  const [buscandoNaReceita, setBuscandoNaReceita] = useState(false);
  /* Estado, nao ref: e lido durante a renderizacao para decidir se ainda falta
     consultar, e ler ref em render nao atualiza a tela. */
  const [documentoConsultado, setDocumentoConsultado] = useState("");

  /* Carregar o formulario e ajuste de estado a uma mudanca de prop, nao efeito
     colateral: fazer isso durante a renderizacao evita o render extra com o
     conteudo velho na tela, e e o padrao que o resto do admin usa. */
  const chaveDoFormulario = open ? initial?.id ?? "novo" : "";
  const [chaveCarregada, setChaveCarregada] = useState("");
  if (chaveCarregada !== chaveDoFormulario) {
    setChaveCarregada(chaveDoFormulario);
    setRecusa(null);
    setDocumentoConsultado("");
    setForm(
      initial && open
        ? {
            name: initial.name,
            cnpj: initial.cnpj,
            category: initial.category,
            city: initial.city,
            email: initial.email,
            phone: initial.phone,
            paymentTermsPrimary: initial.paymentTermsPrimary,
            paymentTermsSecondary: initial.paymentTermsSecondary,
            status: initial.status,
            notes: initial.notes || "",
          }
        : DEFAULT_DRAFT
    );
  }

  const documentoGravado = digits(initial?.cnpj || "");
  const documentoDigitado = digits(form.cnpj);
  const documentoCompleto = documentoDigitado.length === 11 || documentoDigitado.length === 14;
  /* Cadastro antigo com documento invalido continua verde enquanto ninguem
     encostar nele, senao arrumar o telefone vira uma parede. */
  const documentoConferido =
    documentoCompleto && (documentoValido(documentoDigitado) || documentoDigitado === documentoGravado);

  /* Razao social, cidade e contato pela Receita, igual ao cadastro de cliente.
     So preenche campo vazio: o que a pessoa digitou tem preferencia sempre.
     A marca de "buscando" e decidida na renderizacao, e nao dentro do efeito:
     efeito que chama setState em linha reta dispara render em cascata. */
  const precisaConsultar =
    open &&
    documentoDigitado.length === 14 &&
    documentoValido(documentoDigitado) &&
    documentoConsultado !== documentoDigitado;

  if (precisaConsultar && !buscandoNaReceita) {
    setBuscandoNaReceita(true);
  }

  useEffect(() => {
    if (!precisaConsultar) return;

    let cancelado = false;
    fetch(`https://publica.cnpj.ws/cnpj/${documentoDigitado}`)
      .then((resposta) => (resposta.ok ? resposta.json() : null))
      .then((dados: Record<string, unknown> | null) => {
        if (cancelado || !dados) return;
        const estabelecimento = (dados.estabelecimento ?? {}) as Record<string, unknown>;
        const cidade = (estabelecimento.cidade ?? {}) as Record<string, unknown>;
        const ddd = String(estabelecimento.ddd1 || "");
        const numero = String(estabelecimento.telefone1 || "");
        setForm((atual) => ({
          ...atual,
          name: atual.name.trim() || String(dados.razao_social || ""),
          city: atual.city.trim() || String(cidade.nome || ""),
          email: atual.email.trim() || String(estabelecimento.email || ""),
          phone: digits(atual.phone) || digits(`${ddd}${numero}`),
        }));
      })
      .catch(() => {
        /* Consulta publica que pode estar fora do ar. Nunca impede o cadastro. */
      })
      .finally(() => {
        if (cancelado) return;
        setBuscandoNaReceita(false);
        /* Marca como consultado so no fim: e isto que impede a consulta de
           repetir e encerra o "precisaConsultar". */
        setDocumentoConsultado(documentoDigitado);
      });

    return () => {
      cancelado = true;
    };
  }, [precisaConsultar, documentoDigitado]);

  async function enviar() {
    const problema = conferirFornecedor(
      { nome: form.name, documento: form.cnpj, email: form.email, telefone: form.phone },
      { documentoJaGravado: documentoGravado }
    );
    setRecusa(problema);
    if (problema) return;
    await onSubmit(form);
  }

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent className="w-[96vw] max-w-[760px] overflow-visible rounded-2xl border-slate-200 p-0">
        <DialogHeader className="border-b border-slate-200 px-5 py-4">
          <DialogTitle className="text-base font-semibold tracking-[-0.02em]">{title}</DialogTitle>
          <DialogDescription className="text-sm text-slate-500">{description}</DialogDescription>
        </DialogHeader>

        {recusa ? (
          <div className="mx-5 mt-5 flex items-start gap-2 rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">
            <AlertCircle className="mt-0.5 h-4 w-4 shrink-0" />
            <span>{recusa.mensagem}</span>
          </div>
        ) : null}

        <div className="grid gap-5 px-5 py-5 md:grid-cols-2">
          <label className="space-y-2">
            <div className="text-sm font-medium text-slate-900">
              Nome do fornecedor <span className="text-rose-500">*</span>
            </div>
            <Input
              value={form.name}
              onChange={(e) => setForm((prev) => ({ ...prev, name: e.target.value }))}
              placeholder="Como você chama esse fornecedor"
              className={twMerge(
                "h-11 rounded-xl border-slate-200 bg-white",
                recusa?.campo === "nome" ? "border-rose-300" : ""
              )}
            />
          </label>

          <label className="space-y-2">
            <div className="flex items-center justify-between gap-2">
              <div className="text-sm font-medium text-slate-900">
                {rotuloDoDocumento(form.cnpj)} <span className="text-rose-500">*</span>
              </div>
              {buscandoNaReceita ? (
                <span className="inline-flex items-center gap-1.5 text-xs text-slate-500">
                  <Loader2 className="h-3.5 w-3.5 animate-spin" />
                  Buscando na Receita
                </span>
              ) : documentoCompleto ? (
                documentoConferido ? (
                  <span className="inline-flex items-center gap-1.5 text-xs font-medium text-emerald-700">
                    <CheckCircle2 className="h-3.5 w-3.5" />
                    Documento confere
                  </span>
                ) : (
                  <span className="inline-flex items-center gap-1.5 text-xs font-medium text-rose-600">
                    <AlertCircle className="h-3.5 w-3.5" />
                    Número não existe
                  </span>
                )
              ) : null}
            </div>
            <Input
              value={formatCnpj(form.cnpj)}
              onChange={(e) => {
                setRecusa(null);
                setForm((prev) => ({ ...prev, cnpj: digits(e.target.value) }));
              }}
              placeholder="CNPJ da empresa ou CPF da pessoa"
              className={twMerge(
                "h-11 rounded-xl border-slate-200 bg-white",
                recusa?.campo === "documento" || (documentoCompleto && !documentoConferido) ? "border-rose-300" : ""
              )}
            />
          </label>

          <label className="space-y-2">
            <div className="text-sm font-medium text-slate-900">Categoria</div>
            <Input
              value={form.category}
              onChange={(e) => setForm((prev) => ({ ...prev, category: e.target.value }))}
              list="supplier-category-hints"
              placeholder="Ex: Ferragens"
              className="h-11 rounded-xl border-slate-200 bg-white"
            />
          </label>

          <label className="space-y-2">
            <div className="text-sm font-medium text-slate-900">Cidade</div>
            <Input
              value={form.city}
              onChange={(e) => setForm((prev) => ({ ...prev, city: e.target.value }))}
              list="supplier-city-hints"
              placeholder="Cidade"
              className="h-11 rounded-xl border-slate-200 bg-white"
            />
          </label>

          <label className="space-y-2">
            <div className="text-sm font-medium text-slate-900">Telefone</div>
            <Input
              value={formatPhone(form.phone)}
              onChange={(e) => {
                setRecusa(null);
                setForm((prev) => ({ ...prev, phone: digits(e.target.value) }));
              }}
              placeholder="(11) 99999-9999"
              className={twMerge(
                "h-11 rounded-xl border-slate-200 bg-white",
                recusa?.campo === "telefone" || recusa?.campo === "contato" ? "border-rose-300" : ""
              )}
            />
          </label>

          <label className="space-y-2">
            <div className="text-sm font-medium text-slate-900">E-mail</div>
            <Input
              value={form.email}
              onChange={(e) => {
                setRecusa(null);
                setForm((prev) => ({ ...prev, email: e.target.value }));
              }}
              placeholder="financeiro@empresa.com.br"
              className={twMerge(
                "h-11 rounded-xl border-slate-200 bg-white",
                recusa?.campo === "email" || recusa?.campo === "contato" ? "border-rose-300" : ""
              )}
            />
          </label>

          <div className="-mt-2 text-xs text-slate-500 md:col-span-2">
            Telefone ou e-mail: preencha pelo menos um, para conseguir mandar pedido de compra para
            esse fornecedor depois.
          </div>

          <label className="space-y-2">
            <div className="text-sm font-medium text-slate-900">Condição (principal)</div>
            <CustomSelect
              value={form.paymentTermsPrimary}
              onChange={(value) => setForm((prev) => ({ ...prev, paymentTermsPrimary: value }))}
              options={PAYMENT_PRIMARY_OPTIONS}
              portal={false}
              className="h-11 rounded-xl"
            />
          </label>

          <label className="space-y-2">
            <div className="text-sm font-medium text-slate-900">Condição (meio)</div>
            <CustomSelect
              value={form.paymentTermsSecondary}
              onChange={(value) => setForm((prev) => ({ ...prev, paymentTermsSecondary: value }))}
              options={PAYMENT_SECONDARY_OPTIONS}
              portal={false}
              className="h-11 rounded-xl"
            />
          </label>

          <label className="space-y-2 md:col-span-2">
            <div className="text-sm font-medium text-slate-900">Observações</div>
            <textarea
              value={form.notes}
              onChange={(e) => setForm((prev) => ({ ...prev, notes: e.target.value }))}
              rows={4}
              className="w-full resize-none rounded-xl border border-slate-200 bg-white px-3 py-3 text-sm text-slate-800 outline-none"
              placeholder="Anotações internas, regras de negociação, observações..."
            />
          </label>

          <label className="space-y-2 md:col-span-2">
            <div className="text-sm font-medium text-slate-900">Status</div>
            <CustomSelect
              value={form.status}
              onChange={(value) => setForm((prev) => ({ ...prev, status: value as SupplierStatus }))}
              options={[
                { value: "ativo", label: "Ativo" },
                { value: "pendente", label: "Pendente" },
                { value: "inativo", label: "Inativo" },
              ]}
              portal={false}
              className="h-11 rounded-xl"
            />
          </label>
        </div>

        <datalist id="supplier-category-hints">
          {categoryHints.map((item) => (
            <option key={item} value={item} />
          ))}
        </datalist>

        <datalist id="supplier-city-hints">
          {cityHints.map((item) => (
            <option key={item} value={item} />
          ))}
        </datalist>

        <DialogFooter className="border-t border-slate-200 px-5 py-4">
          <div className="mr-auto text-sm text-rose-600">{error || ""}</div>
          <Button variant="outline" onClick={() => onOpenChange(false)} className="h-11 rounded-xl border-slate-200 bg-white">
            Cancelar
          </Button>
          {/* Sempre habilitado. Quem decide se passa e a checagem, e ela diz o
              que falta em vez de deixar a pessoa clicando num botao morto. */}
          <Button
            onClick={enviar}
            disabled={loading}
            icon={loading ? <ShieldCheck className="h-4.5 w-4.5" /> : undefined}
            className="h-11 rounded-xl"
            style={{ backgroundColor: kPurple }}
          >
            {loading ? "Salvando..." : submitLabel}
          </Button>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  );
}

type ResultadoDaImportacao = {
  criados: number;
  atualizados: number;
  recusados: Array<{ linha: number; nome: string; motivo: string }>;
};

function ImportDialog({
  open,
  onOpenChange,
  busy,
  error,
  resultado,
  onImport,
}: {
  open: boolean;
  onOpenChange: (value: boolean) => void;
  busy: boolean;
  error: string | null;
  resultado: ResultadoDaImportacao | null;
  onImport: (items: SupplierDraft[]) => Promise<void>;
}) {
  const [raw, setRaw] = useState("");

  /* O campo abria preenchido com uma linha de exemplo que parecia real, e
     quem clicasse em Importar sem apagar cadastrava um fornecedor de mentira.
     Agora abre vazio, e o exemplo fica atras de um botao. */
  const EXEMPLO = [
    "empresa;cnpj;categoria;cidade;email;telefone;condicao_1;condicao_2;status",
    "Papelaria Central;11222333000181;Papelaria;São Paulo;compras@papelariacentral.com.br;11999991111;30 dias;Boleto;ativo",
  ].join("\n");

  const [abertaConhecida, setAbertaConhecida] = useState(false);
  if (abertaConhecida !== open) {
    setAbertaConhecida(open);
    if (open) setRaw("");
  }

  const parse = (value: string) => {
    const lines = value
      .split(/\r?\n/)
      .map((line) => line.trim())
      .filter(Boolean);
    if (lines.length < 2) return [];
    const header = lines[0].split(";").map((item) => item.trim().toLowerCase());
    const indexOf = (key: string) => header.indexOf(key);
    const indexes = {
      name: indexOf("empresa"),
      cnpj: indexOf("cnpj"),
      category: indexOf("categoria"),
      city: indexOf("cidade"),
      email: indexOf("email"),
      phone: indexOf("telefone"),
      primary: indexOf("condicao_1"),
      secondary: indexOf("condicao_2"),
      status: indexOf("status"),
    };

    return lines.slice(1).map((line) => {
      const parts = line.split(";").map((item) => item.trim());
      const pick = (key: keyof typeof indexes) => {
        const index = indexes[key];
        return index >= 0 ? parts[index] || "" : "";
      };
      const rawStatus = pick("status").toLowerCase();
      const status: SupplierStatus = rawStatus === "pendente" ? "pendente" : rawStatus === "inativo" ? "inativo" : "ativo";
      return {
        name: pick("name"),
        cnpj: digits(pick("cnpj")),
        category: pick("category"),
        city: pick("city") || "São Paulo",
        email: pick("email"),
        phone: digits(pick("phone")),
        paymentTermsPrimary: pick("primary") || "30 dias",
        paymentTermsSecondary: pick("secondary") || "Boleto",
        status,
        notes: "",
      } satisfies SupplierDraft;
    });
  };

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent className="w-[96vw] max-w-[860px] overflow-visible rounded-2xl border-slate-200 p-0">
        <DialogHeader className="border-b border-slate-200 px-5 py-4">
          <DialogTitle className="text-base font-semibold tracking-[-0.02em]">Importar fornecedores</DialogTitle>
          <DialogDescription className="text-sm text-slate-500">
            Cole o CSV separado por ponto e vírgula para cadastrar múltiplos fornecedores de uma vez.
          </DialogDescription>
        </DialogHeader>

        <div className="grid gap-5 px-5 py-5 lg:grid-cols-[1.2fr_0.8fr]">
          <div className="space-y-3">
            <div className="rounded-2xl border border-slate-200 bg-white">
              <div className="flex items-center justify-between border-b border-slate-100 px-4 py-3">
                <div className="text-sm font-semibold text-slate-900">CSV</div>
                <div className="text-xs text-slate-500">empresa;cnpj;categoria;cidade;email;telefone;condicao_1;condicao_2;status</div>
              </div>
              <textarea
                value={raw}
                onChange={(e) => setRaw(e.target.value)}
                placeholder="Cole aqui as linhas do seu arquivo, uma por fornecedor."
                className="h-[260px] w-full resize-none rounded-b-2xl bg-white px-4 py-3 text-sm text-slate-800 outline-none placeholder:text-slate-400"
              />
            </div>
            <button
              type="button"
              onClick={() => setRaw(EXEMPLO)}
              className="text-sm font-medium text-[var(--ks-color-primary)] underline-offset-2 hover:underline"
            >
              Colar um exemplo para eu ver o formato
            </button>
            {error ? <div className="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">{error}</div> : null}
            {resultado ? (
              <div
                className={twMerge(
                  "space-y-2 rounded-2xl border px-4 py-3 text-sm",
                  resultado.recusados.length > 0
                    ? "border-amber-200 bg-amber-50 text-amber-900"
                    : "border-emerald-200 bg-emerald-50 text-emerald-800"
                )}
              >
                <div className="font-semibold">
                  {resultado.criados} cadastrado(s), {resultado.atualizados} atualizado(s)
                  {resultado.recusados.length > 0 ? `, ${resultado.recusados.length} recusado(s)` : ""}.
                </div>
                {resultado.recusados.length > 0 ? (
                  <ul className="space-y-1">
                    {resultado.recusados.map((item) => (
                      <li key={`${item.linha}-${item.nome}`}>
                        Linha {item.linha} ({item.nome}): {item.motivo}
                      </li>
                    ))}
                  </ul>
                ) : null}
              </div>
            ) : null}
          </div>

          <div className="space-y-4">
            <div className="rounded-2xl border border-slate-200 bg-[linear-gradient(135deg,rgba(79,70,229,0.10)_0%,rgba(124,58,237,0.10)_100%)] p-4">
              <div className="flex items-center gap-3">
                <div className="flex h-10 w-10 items-center justify-center rounded-xl bg-white text-[var(--ks-color-primary)]">
                  <FileUp className="h-5 w-5" />
                </div>
                <div>
                  <div className="text-sm font-semibold text-slate-900">Importação real</div>
                  <div className="mt-0.5 text-sm text-slate-600">Atualiza ou cria fornecedores pelo CNPJ e mantém o módulo sincronizado.</div>
                </div>
              </div>
            </div>

            <div className="rounded-2xl border border-slate-200 bg-white p-4">
              <div className="text-sm font-semibold text-slate-900">Dicas</div>
              <div className="mt-2 space-y-2 text-sm text-slate-600">
                <div>Use ponto e vírgula para separar colunas.</div>
                <div>A coluna do documento aceita CNPJ ou CPF.</div>
                <div>O status aceita: ativo, pendente, inativo.</div>
                <div>Documento repetido atualiza o fornecedor existente.</div>
                <div>Linha com problema não derruba as outras: no fim você vê quais recusaram e por quê.</div>
              </div>
            </div>
          </div>
        </div>

        <DialogFooter className="border-t border-slate-200 px-5 py-4">
          <Button variant="outline" onClick={() => onOpenChange(false)} className="h-11 rounded-xl border-slate-200 bg-white">
            Cancelar
          </Button>
          <Button
            onClick={async () => onImport(parse(raw))}
            disabled={busy}
            className="h-11 rounded-xl"
            style={{ backgroundColor: kPurple }}
          >
            {busy ? "Importando..." : "Importar"}
          </Button>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  );
}

function ViewDialog({
  open,
  onOpenChange,
  supplier,
  onGoPayables,
}: {
  open: boolean;
  onOpenChange: (value: boolean) => void;
  supplier: SupplierRow | null;
  onGoPayables: (supplier: SupplierRow) => void;
}) {
  if (!supplier) return null;

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent className="w-[96vw] max-w-[820px] overflow-visible rounded-2xl border-slate-200 p-0">
        <DialogHeader className="border-b border-slate-200 px-5 py-4">
          <DialogTitle className="text-base font-semibold tracking-[-0.02em]">Fornecedor</DialogTitle>
          <DialogDescription className="text-sm text-slate-500">Dados e vinculos financeiros.</DialogDescription>
        </DialogHeader>

        <div className="grid gap-5 px-5 py-5 md:grid-cols-[1.2fr_0.8fr]">
          <div className="rounded-2xl border border-slate-200 bg-white p-5">
            <div className="flex items-start justify-between gap-4">
              <div className="flex items-start gap-4">
                <div className="flex h-12 w-12 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 text-sm font-semibold text-slate-700">
                  {getInitials(supplier.name)}
                </div>
                <div className="min-w-0">
                  <div className="truncate text-base font-semibold tracking-[-0.02em] text-slate-950">{supplier.name}</div>
                  <div className="mt-1 text-sm text-slate-500">
                    {rotuloDoDocumento(supplier.cnpj)}: {formatCnpj(supplier.cnpj)}
                  </div>
                </div>
              </div>
              <span className={`inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-semibold ${statusBadge(supplier.status)}`}>
                {supplier.status === "ativo" ? "Ativo" : supplier.status === "pendente" ? "Pendente" : "Inativo"}
              </span>
            </div>

            <div className="mt-6 grid gap-3 md:grid-cols-2">
              <div className="rounded-2xl border border-slate-200 bg-slate-50 p-4">
                <div className="flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-slate-500">
                  <Mail className="h-4 w-4" />
                  Contato
                </div>
                <div className="mt-3 space-y-2 text-sm text-slate-700">
                  <div className="flex items-center gap-2">
                    <Mail className="h-4 w-4 text-slate-500" />
                    <span className="truncate">{supplier.email}</span>
                  </div>
                  <div className="flex items-center gap-2">
                    <Phone className="h-4 w-4 text-slate-500" />
                    <span>{formatPhone(supplier.phone)}</span>
                  </div>
                </div>
              </div>

              <div className="rounded-2xl border border-slate-200 bg-slate-50 p-4">
                <div className="flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-slate-500">
                  <CreditCard className="h-4 w-4" />
                  Condições
                </div>
                <div className="mt-3 space-y-1 text-sm text-slate-700">
                  <div className="font-semibold text-slate-900">{supplier.paymentTermsPrimary}</div>
                  <div className="text-slate-600">{supplier.paymentTermsSecondary}</div>
                  <div className="text-slate-600">{supplier.category} • {supplier.city}</div>
                </div>
              </div>
            </div>

            {supplier.notes ? (
              <div className="mt-4 rounded-2xl border border-slate-200 bg-slate-50 p-4 text-sm text-slate-700">
                {supplier.notes}
              </div>
            ) : null}
          </div>

          <div className="space-y-4">
            <div className="rounded-2xl border border-slate-200 bg-white p-5">
              <div className="flex items-center justify-between">
                <div className="text-sm font-semibold text-slate-900">Contas vinculadas</div>
                <div className="text-xs text-slate-500">{supplier.openBillsCount ? `${supplier.openBillsCount} em aberto` : "Todas pagas"}</div>
              </div>
              <div className="mt-3 text-2xl font-semibold tracking-[-0.04em] text-slate-950">{money(supplier.openBillsTotal)}</div>
              <div className="mt-2 text-sm text-slate-500">
                {supplier.openBillsTotal > 0 ? "Despesas reais vinculadas a este fornecedor no financeiro." : "Sem pendências financeiras para este fornecedor."}
              </div>
              <div className="mt-4">
                <Button
                  variant="outline"
                  onClick={() => onGoPayables(supplier)}
                  className="h-11 w-full rounded-xl border-slate-200 bg-white"
                  icon={<Wallet className="h-4.5 w-4.5" />}
                >
                  Abrir contas a pagar
                </Button>
              </div>
            </div>

            <div className="rounded-2xl border border-slate-200 bg-[linear-gradient(135deg,rgba(79,70,229,0.10)_0%,rgba(124,58,237,0.10)_100%)] p-5">
              <div className="flex items-start gap-3">
                <div className="flex h-10 w-10 items-center justify-center rounded-xl bg-white text-[var(--ks-color-primary)]">
                  <ShieldCheck className="h-5 w-5" />
                </div>
                <div>
                  <div className="text-sm font-semibold text-slate-900">Condições de pagamento</div>
                  <div className="mt-1 text-sm leading-6 text-slate-600">
                    {supplier.paymentTermsPrimary} em {supplier.paymentTermsSecondary}. É o prazo que o
                    sistema sugere ao gerar a conta a pagar de uma compra desse fornecedor.
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>

        <DialogFooter className="border-t border-slate-200 px-5 py-4">
          <Button variant="outline" onClick={() => onOpenChange(false)} className="h-11 rounded-xl border-slate-200 bg-white">
            Fechar
          </Button>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  );
}

function SponsoredSuppliersTab({
  suppliers,
  loading,
  error,
}: {
  suppliers: SponsoredSupplierRow[];
  loading: boolean;
  error: string | null;
}) {
  const [activeSupplier, setActiveSupplier] = useState<SponsoredSupplierRow | null>(null);
  const [viewOpen, setViewOpen] = useState(false);

  if (error) {
    return (
      <section className="rounded-2xl border border-rose-200 bg-rose-50 px-5 py-4 text-sm text-rose-700">
        {error}
      </section>
    );
  }

  return (
    <section className="overflow-hidden rounded-2xl border border-slate-200 bg-white">
        <div className="border-b border-slate-200 px-5 py-4">
          <div className="text-sm font-semibold text-slate-900">Patrocinados</div>
          <div className="mt-1 text-sm text-slate-500">
            Fornecedores indicados pela Ktalogu para ajudar você a encontrar parceiros comerciais com mais rapidez, ampliar opções de compra e facilitar novas negociações.
          </div>
        </div>

        <div className="max-h-[520px] overflow-auto">
          <table className="w-full border-collapse text-sm">
            <thead className="sticky top-0 z-10 bg-white">
              <tr className="border-b border-slate-200 text-xs font-semibold text-slate-500">
                <th className="px-4 py-3 text-left">Fornecedor</th>
                <th className="px-4 py-3 text-left">Categoria</th>
                <th className="px-4 py-3 text-left">Contato</th>
                <th className="px-4 py-3 text-left">Condições de pagamento</th>
                <th className="px-4 py-3 text-left">Oferta Ktalogu</th>
                <th className="px-4 py-3 text-left">Site</th>
                <th className="px-4 py-3 text-left">Status</th>
                <th className="w-24 px-4 py-3 text-right">Ações</th>
              </tr>
            </thead>
            <tbody>
              {loading ? (
                Array.from({ length: PAGE_SIZE }).map((_, index) => (
                  <tr key={index} className="border-b border-slate-100">
                    <td colSpan={8} className="px-4 py-5">
                      <div className="h-12 animate-pulse rounded-2xl bg-slate-100" />
                    </td>
                  </tr>
                ))
              ) : suppliers.length === 0 ? (
                <tr>
                  <td colSpan={8} className="px-4 py-12 text-center text-sm text-slate-500">
                    Nenhum fornecedor patrocinado ativo foi cadastrado no Owner ainda.
                  </td>
                </tr>
              ) : (
                suppliers.map((supplier) => (
                  <tr key={supplier.id} className="border-b border-slate-100 transition hover:bg-slate-50">
                    <td className="px-4 py-5">
                      <div className="flex items-center gap-4">
                        <SupplierAvatar name={supplier.name} imageUrl={supplier.imageUrl} className="h-14 w-14 rounded-2xl" textClassName="text-sm" />
                        <div className="min-w-0">
                          <div className="truncate text-sm font-semibold text-slate-950">{supplier.name}</div>
                          <div className="mt-0.5 text-xs text-slate-500">
                            CNPJ: {formatCnpj(supplier.cnpj)}
                            {supplier.legalName && supplier.legalName !== supplier.name ? ` • ${supplier.legalName}` : ""}
                          </div>
                          {supplier.description ? <div className="mt-1 line-clamp-2 max-w-[340px] text-xs leading-5 text-slate-500">{supplier.description}</div> : null}
                        </div>
                      </div>
                    </td>
                    <td className="px-4 py-5">
                      <div className="text-sm font-medium text-slate-700">{supplier.category || "Sem categoria"}</div>
                      <div className="mt-0.5 text-xs text-slate-500">{supplier.city || "Sem cidade"}</div>
                    </td>
                    <td className="px-4 py-5">
                      <div className="space-y-1 text-sm text-slate-700">
                        <div className="flex items-center gap-2">
                          <Mail className="h-4 w-4 text-slate-400" />
                          <span className="truncate">{supplier.email}</span>
                        </div>
                        <div className="flex items-center gap-2">
                          <Phone className="h-4 w-4 text-slate-400" />
                          <span>{formatPhone(supplier.phone)}</span>
                        </div>
                      </div>
                    </td>
                    <td className="px-4 py-5">
                      <div className="text-sm font-semibold text-slate-900">{supplier.paymentTermsPrimary}</div>
                      <div className="mt-0.5 text-xs text-slate-500">{supplier.paymentTermsSecondary}</div>
                      <div className="mt-0.5 text-xs text-slate-500">Posição: {supplier.position}</div>
                    </td>
                    <td className="px-4 py-5">
                      {supplier.subscriberDiscount ? (
                        <SponsoredOfferBadge value={supplier.subscriberDiscount} compact />
                      ) : (
                        <span className="text-xs text-slate-400">Sem oferta exclusiva</span>
                      )}
                    </td>
                    <td className="px-4 py-5">
                      {supplier.websiteUrl ? (
                        <a
                          href={supplier.websiteUrl}
                          target="_blank"
                          rel="noopener noreferrer"
                          className="inline-flex max-w-[220px] items-center gap-2 truncate rounded-xl border border-slate-200 bg-white px-3 py-2 text-xs font-semibold text-slate-700 transition hover:bg-slate-50"
                        >
                          <ExternalLink className="h-4 w-4 text-slate-400" />
                          <span className="truncate">{supplier.websiteUrl}</span>
                        </a>
                      ) : (
                        <span className="text-xs text-slate-400">Sem site</span>
                      )}
                    </td>
                    <td className="px-4 py-5">
                      <span className="inline-flex items-center rounded-full border border-[rgba(79,70,229,0.15)] bg-[rgba(79,70,229,0.08)] px-2.5 py-1 text-xs font-semibold text-[var(--ks-color-primary)]">
                        Patrocinado
                      </span>
                    </td>
                    <td className="px-4 py-5 text-right">
                      <div className="inline-flex items-center gap-2">
                        <button
                          type="button"
                          onClick={() => {
                            setActiveSupplier(supplier);
                            setViewOpen(true);
                          }}
                          className="inline-flex h-9 w-9 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-700 transition hover:bg-slate-50"
                          aria-label="Ver fornecedor patrocinado"
                          title="Ver fornecedor patrocinado"
                        >
                          <Eye className="h-4 w-4 text-slate-500" />
                        </button>
                        {supplier.websiteUrl ? (
                          <a
                            href={supplier.websiteUrl}
                            target="_blank"
                            rel="noopener noreferrer"
                            className="inline-flex h-9 items-center justify-center gap-2 rounded-xl border border-slate-200 bg-white px-3 text-xs font-semibold text-slate-700 transition hover:bg-slate-50"
                          >
                            <ExternalLink className="h-4 w-4 text-slate-400" />
                            Abrir
                          </a>
                        ) : null}
                      </div>
                    </td>
                  </tr>
                ))
              )}
            </tbody>
          </table>
        </div>

        <div className="flex flex-col gap-3 border-t border-slate-200 bg-white px-4 py-4 sm:flex-row sm:items-center sm:justify-between">
          <div className="text-xs text-slate-500">
            {loading ? "Carregando fornecedores patrocinados..." : `${suppliers.length} fornecedor${suppliers.length === 1 ? "" : "es"} patrocinado${suppliers.length === 1 ? "" : "s"}`}
          </div>
        </div>

        <Dialog
          open={viewOpen}
          onOpenChange={(value) => {
            setViewOpen(value);
            if (!value) setActiveSupplier(null);
          }}
        >
          <DialogContent className="flex max-h-[92vh] w-[calc(100vw-20px)] max-w-[940px] flex-col gap-0 overflow-hidden rounded-[24px] border border-[#e5e0ff] bg-[linear-gradient(180deg,#fbfaff_0%,#f7f5ff_100%)] p-0 shadow-[0_24px_70px_rgba(76,61,143,0.24)] sm:w-[94vw]">
            <DialogHeader className="px-4 pb-0 pt-4 sm:px-5">
              <DialogTitle className="flex items-center gap-2 text-[17px] font-semibold tracking-[-0.02em] text-[#4f46e5]">
                <BadgeCheck className="h-4.5 w-4.5 fill-[#ede9fe] text-[#6d28d9]" />
                Fornecedor patrocinado
              </DialogTitle>
              <DialogDescription className="pt-1 text-sm text-slate-500">
                Informações completas do fornecedor indicado pela Ktalogu.
              </DialogDescription>
            </DialogHeader>

            {activeSupplier ? (
              <div className="flex-1 space-y-3 overflow-y-auto px-3 py-3 sm:px-4 sm:py-4 md:px-5 md:py-5">
                <section className="overflow-hidden rounded-[20px] border border-[#ece8ff] bg-white shadow-[0_12px_28px_rgba(80,60,160,0.08)]">
                  <div className="relative h-[120px] overflow-hidden bg-[linear-gradient(135deg,#090d23_0%,#11183d_45%,#24185b_100%)] sm:h-[138px] md:h-[150px]">
                    {activeSupplier.imageUrl ? (
                      <>
                        <img src={activeSupplier.imageUrl} alt={activeSupplier.name} className="h-full w-full object-cover opacity-60" />
                        <div className="absolute inset-0 bg-[linear-gradient(90deg,rgba(5,10,30,0.85)_0%,rgba(12,18,47,0.72)_32%,rgba(22,27,66,0.35)_62%,rgba(31,41,90,0.18)_100%)]" />
                      </>
                    ) : (
                      <div className="absolute inset-0 bg-[radial-gradient(circle_at_18%_20%,rgba(124,58,237,0.30),transparent_24%),radial-gradient(circle_at_80%_20%,rgba(59,130,246,0.18),transparent_22%),linear-gradient(135deg,#090d23_0%,#11183d_45%,#24185b_100%)]" />
                    )}

                    <div className="absolute left-4 top-4 max-w-[220px] text-white sm:left-5 sm:top-5 sm:max-w-[280px] md:max-w-[320px]">
                      <div className="text-[20px] font-semibold leading-[1.02] tracking-[-0.05em] sm:text-[24px] md:text-[27px]">
                        Soluções que
                        <br />
                        fortalecem sua
                        <span className="text-[#b794ff]"> operação.</span>
                      </div>
                      <div className="mt-2 h-1 w-9 rounded-full bg-[#9f67ff] sm:mt-3 sm:w-11" />
                    </div>
                  </div>

                  <div className="relative px-4 pb-4 sm:px-5 sm:pb-5">
                    <div className="flex flex-col gap-4 md:flex-row md:items-end md:justify-between">
                      <div className="flex flex-1 items-end gap-3 sm:gap-4">
                        <div className="-mt-8 sm:-mt-10">
                          <div className="relative">
                            <SupplierAvatar
                              name={activeSupplier.name}
                              imageUrl={activeSupplier.imageUrl}
                              className="h-[82px] w-[82px] rounded-[22px] border-4 border-white bg-white text-[24px] shadow-[0_14px_28px_rgba(15,23,42,0.16)] sm:h-[96px] sm:w-[96px] sm:rounded-[24px] md:h-[104px] md:w-[104px]"
                              textClassName="text-[24px] sm:text-[28px]"
                            />
                            <span className="absolute bottom-1.5 right-1.5 h-3.5 w-3.5 rounded-full border-2 border-white bg-emerald-400 shadow-sm sm:bottom-2 sm:right-2 sm:h-4 sm:w-4 sm:border-[3px]" />
                          </div>
                        </div>

                        <div className="min-w-0 flex-1 pt-3 sm:pt-4">
                          <div className="flex flex-wrap items-center gap-2">
                            <div className="text-[22px] font-semibold leading-none tracking-[-0.05em] text-slate-950 sm:text-[26px] md:text-[29px]">
                              {activeSupplier.name}
                            </div>
                            <BadgeCheck className="h-4 w-4 fill-[#ede9fe] text-[#7c3aed] sm:h-4.5 sm:w-4.5" />
                            <span className="inline-flex items-center rounded-full bg-[#f4edff] px-3 py-1 text-xs font-semibold text-[#7c3aed]">
                              Patrocinado
                            </span>
                          </div>
                          <div className="mt-1.5 text-xs text-slate-500 sm:mt-2 sm:text-sm">CNPJ: {formatCnpj(activeSupplier.cnpj)}</div>
                          {activeSupplier.legalName && activeSupplier.legalName !== activeSupplier.name ? (
                            <div className="mt-1 text-xs text-slate-600 sm:text-sm">{activeSupplier.legalName}</div>
                          ) : null}
                        </div>
                      </div>
                    </div>

                    <div className="mt-5 grid gap-2 grid-cols-2 md:grid-cols-2 xl:grid-cols-4">
                      <a
                        href={`mailto:${activeSupplier.email}`}
                        className="inline-flex h-11 items-center justify-center gap-2 rounded-xl border border-[#ebe7fb] bg-[#faf9ff] px-3 text-xs font-medium text-slate-700 transition hover:bg-white sm:h-12 sm:rounded-2xl sm:px-4 sm:text-sm"
                      >
                        <Mail className="h-4 w-4 text-[#8b5cf6]" />
                        E-mail
                      </a>
                      <a
                        href={`tel:${digits(activeSupplier.phone)}`}
                        className="inline-flex h-11 items-center justify-center gap-2 rounded-xl border border-[#ebe7fb] bg-[#faf9ff] px-3 text-xs font-medium text-slate-700 transition hover:bg-white sm:h-12 sm:rounded-2xl sm:px-4 sm:text-sm"
                      >
                        <Phone className="h-4 w-4 text-[#8b5cf6]" />
                        {formatPhone(activeSupplier.phone)}
                      </a>
                      <a
                        href={buildWhatsappHref(activeSupplier.phone) || "#"}
                        target="_blank"
                        rel="noopener noreferrer"
                        className="inline-flex h-11 items-center justify-center gap-2 rounded-xl border border-[#ebe7fb] bg-[#faf9ff] px-3 text-xs font-medium text-slate-700 transition hover:bg-white sm:h-12 sm:rounded-2xl sm:px-4 sm:text-sm"
                      >
                        <MessageCircle className="h-4 w-4 text-[#8b5cf6]" />
                        WhatsApp
                      </a>
                      <a
                        href={normalizeWebsiteHref(activeSupplier.websiteUrl) || "#"}
                        target="_blank"
                        rel="noopener noreferrer"
                        className={twMerge(
                          "inline-flex h-11 items-center justify-center gap-2 rounded-xl border border-[#ebe7fb] bg-[#faf9ff] px-3 text-xs font-medium text-slate-700 transition hover:bg-white sm:h-12 sm:rounded-2xl sm:px-4 sm:text-sm",
                          !activeSupplier.websiteUrl ? "pointer-events-none opacity-40" : ""
                        )}
                      >
                        <ExternalLink className="h-4 w-4 text-[#8b5cf6]" />
                        Abrir site
                      </a>
                    </div>
                  </div>
                </section>

                <section className="grid gap-3 lg:grid-cols-[1.55fr_1fr]">
                  <div className="rounded-[18px] border border-[#ebe7fb] bg-white p-4 shadow-[0_12px_28px_rgba(91,79,171,0.06)] sm:rounded-[22px] sm:p-5">
                    <div className="flex items-center gap-2 text-sm font-semibold text-slate-900">
                      <div className="flex h-7 w-7 items-center justify-center rounded-full bg-[#f3edff] text-[#8b5cf6]">
                        <ReceiptText className="h-3.5 w-3.5" />
                      </div>
                      Sobre o fornecedor
                    </div>
                    <div className="mt-3 space-y-2.5 text-sm leading-6 text-slate-600 sm:mt-4 sm:space-y-3 sm:leading-7">
                      <p>
                        {activeSupplier.description ||
                          "Fornecedor patrocinado pela Ktalogu com informações comerciais disponíveis para facilitar novas negociações e ampliar suas opções de compra."}
                      </p>
                      {activeSupplier.notes ? <p>{activeSupplier.notes}</p> : null}
                    </div>
                    <div className="mt-3 text-sm font-semibold text-[#7c3aed] sm:mt-4">
                      {activeSupplier.subscriberDiscount
                        ? `${activeSupplier.subscriberDiscount} para assinantes Ktalogu.`
                        : "Indicação especial da Ktalogu para consulta comercial."}
                    </div>
                  </div>

                  <div className="rounded-[18px] border border-[#ebe7fb] bg-white p-4 shadow-[0_12px_28px_rgba(91,79,171,0.06)] sm:rounded-[22px] sm:p-5">
                    <div className="flex items-center gap-2 text-sm font-semibold text-slate-900">
                      <div className="flex h-7 w-7 items-center justify-center rounded-full bg-[#f3edff] text-[#8b5cf6]">
                        <ShieldCheck className="h-3.5 w-3.5" />
                      </div>
                      Informações de contato
                    </div>
                    <div className="mt-3 space-y-2.5 text-sm text-slate-600 sm:mt-4 sm:space-y-3">
                      <div className="flex items-start gap-3">
                        <Mail className="mt-0.5 h-4 w-4 text-[#8b5cf6]" />
                        <span className="break-all">{activeSupplier.email}</span>
                      </div>
                      <div className="flex items-start gap-3">
                        <Phone className="mt-0.5 h-4 w-4 text-[#8b5cf6]" />
                        <span>{formatPhone(activeSupplier.phone)}</span>
                      </div>
                      <div className="flex items-start gap-3">
                        {/* Era `adminCompanyCity || ...`: mostrava a cidade de
                            quem estava olhando como se fosse a do fornecedor. */}
                        <MapPin className="mt-0.5 h-4 w-4 text-[#8b5cf6]" />
                        <span>{activeSupplier.city || "Cidade não informada"}</span>
                      </div>
                      <div className="flex items-start gap-3">
                        <Globe className="mt-0.5 h-4 w-4 text-[#8b5cf6]" />
                        <span>{formatWebsiteLabel(activeSupplier.websiteUrl) || "Site não informado"}</span>
                      </div>
                      <div className="flex items-start gap-3">
                        <Building2 className="mt-0.5 h-4 w-4 text-[#8b5cf6]" />
                        <span>{activeSupplier.legalName || activeSupplier.name}</span>
                      </div>
                    </div>
                  </div>
                </section>

                <section className="grid gap-3">
                  <div className="rounded-[18px] border border-[#ebe7fb] bg-white p-4 shadow-[0_12px_28px_rgba(91,79,171,0.06)] sm:rounded-[22px] sm:p-5">
                    <div className="flex items-center gap-2 text-sm font-semibold text-slate-900">
                      <div className="flex h-7 w-7 items-center justify-center rounded-full bg-[#f3edff] text-[#8b5cf6]">
                        <CreditCard className="h-3.5 w-3.5" />
                      </div>
                      Condições comerciais
                    </div>
                    <div className="mt-3 space-y-2.5 text-sm text-slate-600 sm:mt-4 sm:space-y-3">
                      <div className="flex items-center justify-between gap-3">
                        <div className="flex items-center gap-2">
                          <Clock3 className="h-4 w-4 text-[#8b5cf6]" />
                          <span>Prazo de pagamento</span>
                        </div>
                        <span className="font-medium text-slate-900">{activeSupplier.paymentTermsPrimary}</span>
                      </div>
                      <div className="flex items-center justify-between gap-3">
                        <div className="flex items-center gap-2">
                          <Wallet className="h-4 w-4 text-[#8b5cf6]" />
                          <span>Meio de pagamento</span>
                        </div>
                        <span className="font-medium text-slate-900">{activeSupplier.paymentTermsSecondary}</span>
                      </div>
                      {/* Havia aqui um "Atende a região de:" que imprimia a
                          cidade do proprio comprador. O sistema nao guarda
                          area de cobertura nenhuma, entao a linha afirmava uma
                          coisa que ninguem informou. Saiu. */}
                      <div className="flex items-center justify-between gap-3">
                        <div className="flex items-center gap-2">
                          <BadgeCheck className="h-4 w-4 text-[#8b5cf6]" />
                          <span>Condições especiais</span>
                        </div>
                        <span className="inline-flex items-center rounded-full bg-[#f4edff] px-2.5 py-1 text-xs font-semibold text-[#7c3aed]">
                          {activeSupplier.subscriberDiscount || "Consulte condições"}
                        </span>
                      </div>
                    </div>
                  </div>
                </section>
              </div>
            ) : null}

            <DialogFooter className="border-t border-[#ece8ff] px-3 py-3 sm:px-5 sm:py-4">
              <Button variant="outline" onClick={() => setViewOpen(false)} className="h-10 rounded-xl border-[#e7e2fb] bg-white px-5 sm:h-11 sm:rounded-2xl sm:px-6">
                Fechar
              </Button>
            </DialogFooter>
          </DialogContent>
        </Dialog>
      </section>
  );
}

export default function MeusFornecedoresClient() {
  const { pode } = usePermissoes();
  const podeMexerEmFornecedores = pode("suppliers.list.write");

  const router = useRouter();
  const [activeTab, setActiveTab] = useState<"patrocinados" | "meus">("patrocinados");
  const [suppliers, setSuppliers] = useState<SupplierRow[]>([]);
  const [sponsoredSuppliers, setSponsoredSuppliers] = useState<SponsoredSupplierRow[]>([]);
  const [categoryMeta, setCategoryMeta] = useState<Array<{ id: string; name: string }>>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);
  const [sponsoredLoading, setSponsoredLoading] = useState(true);
  const [sponsoredError, setSponsoredError] = useState<string | null>(null);
  const [saving, setSaving] = useState(false);
  const [importing, setImporting] = useState(false);
  const [submitError, setSubmitError] = useState<string | null>(null);
  const [resultadoDaImportacao, setResultadoDaImportacao] = useState<ResultadoDaImportacao | null>(null);
  const [emMassa, setEmMassa] = useState(false);
  const [avisoDaLista, setAvisoDaLista] = useState<string | null>(null);

  const [search, setSearch] = useState("");
  const [status, setStatus] = useState<"todos" | SupplierStatus>("todos");
  const [category, setCategory] = useState("todas");
  const [city, setCity] = useState("todas");
  const [sort, setSort] = useState<"recentes" | "maior_aberto" | "menor_aberto" | "nome">("recentes");
  const [filtersOpen, setFiltersOpen] = useState(false);
  const [onlyWithOpenBills, setOnlyWithOpenBills] = useState(false);
  const [cnpjFilter, setCnpjFilter] = useState("");
  const [paymentMethodFilter, setPaymentMethodFilter] = useState<"todos" | "boleto" | "pix" | "cartao">("todos");

  const [page, setPage] = useState(1);
  const [selectedIds, setSelectedIds] = useState<Set<string>>(() => new Set());

  const [createOpen, setCreateOpen] = useState(false);
  const [importOpen, setImportOpen] = useState(false);
  const [editOpen, setEditOpen] = useState(false);
  const [viewOpen, setViewOpen] = useState(false);
  const [deleteOpen, setDeleteOpen] = useState(false);
  const [activeSupplier, setActiveSupplier] = useState<SupplierRow | null>(null);

  useEffect(() => {
    if (!sponsoredLoading && sponsoredSuppliers.length === 0 && activeTab === "patrocinados") {
      setActiveTab("meus");
    }
  }, [sponsoredLoading, sponsoredSuppliers.length, activeTab]);

  const loadSponsoredSuppliers = useCallback(async () => {
    setSponsoredLoading(true);
    setSponsoredError(null);
    try {
      const response = await fetch("/api/sponsored-suppliers");
      const payload = (await response.json().catch(() => null)) as { error?: string; suppliers?: Array<Record<string, unknown>> } | null;
      if (!response.ok) {
        throw new Error(payload?.error || "Falha ao carregar fornecedores patrocinados.");
      }

      const rows = Array.isArray(payload?.suppliers)
        ? payload.suppliers.map((item) => ({
            id: typeof item.id === "string" ? item.id : "",
            name: typeof item.name === "string" ? item.name : "",
            legalName: typeof item.legal_name === "string" ? item.legal_name : null,
            cnpj: typeof item.cnpj === "string" ? item.cnpj : "",
            category: typeof item.category === "string" ? item.category : null,
            city: typeof item.city === "string" ? item.city : null,
            email: typeof item.email === "string" ? item.email : "",
            phone: typeof item.phone === "string" ? item.phone : "",
            paymentTermsPrimary: typeof item.payment_terms_primary === "string" ? item.payment_terms_primary : "30 dias",
            paymentTermsSecondary: typeof item.payment_terms_secondary === "string" ? item.payment_terms_secondary : "Boleto",
            subscriberDiscount: typeof item.subscriber_discount === "string" ? item.subscriber_discount : null,
            imageUrl: typeof item.image_url === "string" ? item.image_url : null,
            description: typeof item.description === "string" ? item.description : null,
            websiteUrl: typeof item.website_url === "string" ? item.website_url : null,
            notes: typeof item.notes === "string" ? item.notes : null,
            active: item.active === false ? false : true,
            position: typeof item.position === "number" ? item.position : Number(item.position || 0),
            createdAt: typeof item.created_at === "string" ? item.created_at : null,
            updatedAt: typeof item.updated_at === "string" ? item.updated_at : null,
          }))
        : [];

      setSponsoredSuppliers(rows.filter((item) => item.id && item.name));
    } catch (fetchError) {
      setSponsoredError(fetchError instanceof Error ? fetchError.message : "Falha ao carregar fornecedores patrocinados.");
    } finally {
      setSponsoredLoading(false);
    }
  }, []);

  const loadSuppliers = useCallback(async () => {
    setLoading(true);
    setError(null);
    try {
      const response = await fetch("/api/suppliers");
      const payload = await response.json();
      if (!response.ok) throw new Error(payload?.error || "Falha ao carregar fornecedores.");
      setSuppliers(Array.isArray(payload?.suppliers) ? payload.suppliers : []);
      setCategoryMeta(Array.isArray(payload?.meta?.categories) ? payload.meta.categories : []);
    } catch (fetchError) {
      setError(fetchError instanceof Error ? fetchError.message : "Falha ao carregar fornecedores.");
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => {
    loadSuppliers();
  }, [loadSuppliers]);

  useEffect(() => {
    loadSponsoredSuppliers();
  }, [loadSponsoredSuppliers]);

  const categories = useMemo(() => {
    const values = Array.from(new Set(suppliers.map((item) => item.category).filter(Boolean))).sort((a, b) => a.localeCompare(b));
    return ["todas", ...values];
  }, [suppliers]);

  const categoryHints = useMemo(() => {
    const values = Array.from(new Set([...categoryMeta.map((item) => item.name), ...suppliers.map((item) => item.category)])).filter(Boolean);
    return values.sort((a, b) => a.localeCompare(b));
  }, [categoryMeta, suppliers]);

  const cityHints = useMemo(() => {
    const values = Array.from(new Set([...COMMON_CITIES, ...suppliers.map((item) => item.city)])).filter(Boolean);
    return values.sort((a, b) => a.localeCompare(b));
  }, [suppliers]);

  const cities = useMemo(() => {
    const values = Array.from(new Set(suppliers.map((item) => item.city).filter(Boolean))).sort((a, b) => a.localeCompare(b));
    return ["todas", ...values];
  }, [suppliers]);

  const filtered = useMemo(() => {
    const term = search.trim().toLowerCase();
    const cnpj = digits(cnpjFilter).slice(0, 14);
    let list = suppliers.filter((supplier) => {
      if (status !== "todos" && supplier.status !== status) return false;
      if (category !== "todas" && supplier.category !== category) return false;
      if (city !== "todas" && supplier.city !== city) return false;
      if (onlyWithOpenBills && supplier.openBillsTotal <= 0) return false;
      if (paymentMethodFilter !== "todos") {
        const method = supplier.paymentTermsSecondary.toLowerCase();
        if (paymentMethodFilter === "boleto" && !method.includes("boleto")) return false;
        if (paymentMethodFilter === "pix" && !method.includes("pix")) return false;
        if (paymentMethodFilter === "cartao" && !method.includes("cart")) return false;
      }
      if (cnpj && digits(supplier.cnpj) !== cnpj) return false;
      if (!term) return true;
      const hay = `${supplier.name} ${formatCnpj(supplier.cnpj)} ${supplier.email} ${supplier.phone} ${supplier.category} ${supplier.city}`
        .toLowerCase()
        .replace(/\s+/g, " ");
      return hay.includes(term);
    });

    list = [...list].sort((a, b) => {
      if (sort === "nome") return a.name.localeCompare(b.name);
      if (sort === "maior_aberto") return b.openBillsTotal - a.openBillsTotal;
      if (sort === "menor_aberto") return a.openBillsTotal - b.openBillsTotal;
      return sortByRecency(a.createdAt || a.updatedAt, b.createdAt || b.updatedAt);
    });

    return list;
  }, [suppliers, search, status, category, city, sort, onlyWithOpenBills, paymentMethodFilter, cnpjFilter]);

  useEffect(() => {
    setPage(1);
  }, [search, status, category, city, sort, onlyWithOpenBills, paymentMethodFilter, cnpjFilter]);

  const pages = Math.max(1, Math.ceil(filtered.length / PAGE_SIZE));
  const pageItems = useMemo(() => {
    const start = (page - 1) * PAGE_SIZE;
    return filtered.slice(start, start + PAGE_SIZE);
  }, [filtered, page]);

  const showingStart = filtered.length === 0 ? 0 : (page - 1) * PAGE_SIZE + 1;
  const showingEnd = Math.min(filtered.length, (page - 1) * PAGE_SIZE + PAGE_SIZE);
  const allSelectedOnPage = pageItems.length > 0 && pageItems.every((item) => selectedIds.has(item.id));
  const someSelectedOnPage = pageItems.some((item) => selectedIds.has(item.id)) && !allSelectedOnPage;

  const filterChipStyle =
    "h-11 rounded-xl border border-slate-200 bg-white text-sm text-slate-700 hover:bg-slate-50 flex items-center gap-2 px-3";
  const thinSelectClass =
    "h-11 rounded-xl border border-slate-200 bg-white text-sm text-slate-700 shadow-none focus:ring-0";

  async function handleCreate(draft: SupplierDraft) {
    setSaving(true);
    setSubmitError(null);
    try {
      const response = await fetch("/api/suppliers", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ supplier: draft }),
      });
      const payload = await response.json();
      if (!response.ok) throw new Error(payload?.error || "Falha ao criar fornecedor.");
      setCreateOpen(false);
      await loadSuppliers();
    } catch (submit) {
      setSubmitError(submit instanceof Error ? submit.message : "Falha ao criar fornecedor.");
    } finally {
      setSaving(false);
    }
  }

  async function handleUpdate(draft: SupplierDraft) {
    if (!activeSupplier) return;
    setSaving(true);
    setSubmitError(null);
    try {
      const response = await fetch("/api/suppliers", {
        method: "PATCH",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ id: activeSupplier.id, supplier: draft }),
      });
      const payload = await response.json();
      if (!response.ok) throw new Error(payload?.error || "Falha ao atualizar fornecedor.");
      setEditOpen(false);
      setActiveSupplier(null);
      await loadSuppliers();
    } catch (submit) {
      setSubmitError(submit instanceof Error ? submit.message : "Falha ao atualizar fornecedor.");
    } finally {
      setSaving(false);
    }
  }

  async function handleImport(items: SupplierDraft[]) {
    if (items.length === 0) {
      setSubmitError("Cole pelo menos uma linha de fornecedor, além do cabeçalho.");
      return;
    }
    setImporting(true);
    setSubmitError(null);
    setResultadoDaImportacao(null);
    try {
      const response = await fetch("/api/suppliers", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ items }),
      });
      const payload = await response.json();
      if (response.status === 401 || response.status === 403 || typeof payload?.criados !== "number") {
        throw new Error(payload?.error || "Falha ao importar fornecedores.");
      }

      const recusados = Array.isArray(payload.recusados) ? payload.recusados : [];
      setResultadoDaImportacao({
        criados: Number(payload.criados || 0),
        atualizados: Number(payload.atualizados || 0),
        recusados,
      });
      await loadSuppliers();
      /* Se todas passaram nao ha nada para ler: fecha. Com recusa, a janela
         fica aberta mostrando qual linha e por quê. */
      if (recusados.length === 0) setImportOpen(false);
    } catch (submit) {
      setSubmitError(submit instanceof Error ? submit.message : "Falha ao importar fornecedores.");
    } finally {
      setImporting(false);
    }
  }

  /**
   * Ação em massa da lista.
   *
   * A seleção existia inteira: caixinha por linha, caixinha mestre no topo com
   * estado intermediário desenhado à mão, e o contador "N selecionado(s)". Só
   * que nada consumia nada disso, então marcar linha era enfeite. Mudar o
   * status de vários de uma vez é o uso real: desativar meia dúzia de
   * fornecedores que a gráfica parou de usar.
   */
  async function mudarStatusEmMassa(status: SupplierStatus) {
    if (selectedIds.size === 0) return;
    setEmMassa(true);
    setSubmitError(null);
    try {
      const response = await fetch("/api/suppliers", {
        method: "PATCH",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ ids: Array.from(selectedIds), status }),
      });
      const payload = await response.json();
      if (!response.ok) throw new Error(payload?.error || "Falha ao mudar os fornecedores.");
      setSelectedIds(new Set());
      await loadSuppliers();
      setAvisoDaLista(
        `${payload.alterados} fornecedor(es) marcados como ${status}.`
      );
    } catch (erro) {
      setSubmitError(erro instanceof Error ? erro.message : "Falha ao mudar os fornecedores.");
    } finally {
      setEmMassa(false);
    }
  }

  async function handleDelete() {
    if (!activeSupplier) return;
    setSaving(true);
    setSubmitError(null);
    try {
      const response = await fetch("/api/suppliers", {
        method: "DELETE",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ id: activeSupplier.id }),
      });
      const payload = await response.json();
      if (!response.ok) throw new Error(payload?.error || "Falha ao remover fornecedor.");
      setSelectedIds((prev) => {
        const next = new Set(prev);
        next.delete(activeSupplier.id);
        return next;
      });
      setDeleteOpen(false);
      setActiveSupplier(null);
      await loadSuppliers();
    } catch (submit) {
      setSubmitError(submit instanceof Error ? submit.message : "Falha ao remover fornecedor.");
    } finally {
      setSaving(false);
    }
  }

  return (
    <main className="w-full space-y-6 px-4 pb-10 pt-6 sm:px-6">
      <Tabs value={activeTab} onValueChange={(value) => setActiveTab(value as "patrocinados" | "meus")} className="space-y-6">
        <div className="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
          <div className="space-y-4">
            <PageHeader
              eyebrow="Fornecedores"
              title="Fornecedores"
              subtitle="Gerencie sua base de fornecedores e descubra novos parceiros comerciais."
            />
          </div>

          {/* Ficavam so na aba "meus". Como a tela abre em "Patrocinados", quem
              entrava no modulo via uma tela sem nenhuma acao. Agora aparecem
              nas duas abas, e clicar leva para a lista onde o novo aparece. */}
          {podeMexerEmFornecedores ? (
            <div className="flex flex-wrap items-center gap-2 sm:justify-end">
              <Button
                variant="outline"
                icon={<FileUp className="h-4.5 w-4.5" />}
                onClick={() => {
                  setSubmitError(null);
                  setResultadoDaImportacao(null);
                  setActiveTab("meus");
                  setImportOpen(true);
                }}
                className="h-11 rounded-xl border-slate-200 bg-white"
              >
                Importar
              </Button>
              <Button
                icon={<Plus className="h-4.5 w-4.5" />}
                onClick={() => {
                  setSubmitError(null);
                  setActiveTab("meus");
                  setCreateOpen(true);
                }}
                className="h-11 rounded-xl"
                style={{ backgroundColor: kPurple }}
              >
                Novo fornecedor
              </Button>
            </div>
          ) : null}
        </div>

        <SponsoredBannersCarousel placement="admin.meus_fornecedores.top" />

        {activeTab === "meus" ? (
          <section className="rounded-2xl border border-slate-200 bg-white p-4">
            <div className="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
              <div className="grid gap-2 sm:grid-cols-[1.4fr_1fr_1fr_1fr_auto] lg:w-[920px]">
                <div className={twMerge(filterChipStyle, "justify-between")}>
                  <div className="flex min-w-0 items-center gap-2">
                    <Search className="h-4 w-4 text-slate-400" />
                    <input
                      value={search}
                      onChange={(e) => setSearch(e.target.value)}
                      placeholder="Buscar fornecedor..."
                      className="min-w-0 flex-1 bg-transparent text-sm text-slate-800 outline-none placeholder:text-slate-400"
                    />
                  </div>
                </div>

                <CustomSelect
                  value={status}
                  onChange={(value) => setStatus(value as "todos" | SupplierStatus)}
                  options={[
                    { value: "todos", label: "Status: Todos" },
                    { value: "ativo", label: "Status: Ativo" },
                    { value: "pendente", label: "Status: Pendente" },
                    { value: "inativo", label: "Status: Inativo" },
                  ]}
                  className={thinSelectClass}
                />

                <CustomSelect
                  value={category}
                  onChange={setCategory}
                  options={categories.map((value) => ({ value, label: value === "todas" ? "Categoria: Todas" : `Categoria: ${value}` }))}
                  className={thinSelectClass}
                />

                <CustomSelect
                  value={city}
                  onChange={setCity}
                  options={cities.map((value) => ({ value, label: value === "todas" ? "Cidade: Todas" : `Cidade: ${value}` }))}
                  className={thinSelectClass}
                />

                <button type="button" onClick={() => setFiltersOpen(true)} className={twMerge(filterChipStyle, "justify-center")}>
                  <Filter className="h-4 w-4 text-slate-500" />
                  Mais filtros
                </button>
              </div>

              <div className="flex items-center justify-between gap-3 lg:justify-end">
                <div className="text-xs text-slate-500">
                  {selectedIds.size > 0 ? `${selectedIds.size} selecionado(s)` : `${filtered.length} fornecedores`}
                </div>
                <CustomSelect
                  value={sort}
                  onChange={(value) => setSort(value as typeof sort)}
                  options={[
                    { value: "recentes", label: "Ordenar: Mais recentes" },
                    { value: "nome", label: "Ordenar: Nome" },
                    { value: "maior_aberto", label: "Ordenar: Maior em aberto" },
                    { value: "menor_aberto", label: "Ordenar: Menor em aberto" },
                  ]}
                  className={twMerge(thinSelectClass, "min-w-[220px]")}
                />
              </div>
            </div>
          </section>
        ) : null}

        <div>
          <TabsList className="h-auto rounded-2xl bg-slate-100 p-1">
            {(sponsoredLoading || sponsoredSuppliers.length > 0) && (
              <TabsTrigger value="patrocinados" className="rounded-xl px-4 py-2.5">
                Patrocinados
              </TabsTrigger>
            )}
            <TabsTrigger value="meus" className="rounded-xl px-4 py-2.5">
              Meus Fornecedores
            </TabsTrigger>
          </TabsList>
        </div>

        {(sponsoredLoading || sponsoredSuppliers.length > 0) && (
          <TabsContent value="patrocinados" className="mt-0">
            <SponsoredSuppliersTab
              suppliers={sponsoredSuppliers}
              loading={sponsoredLoading}
              error={sponsoredError}
            />
          </TabsContent>
        )}

        <TabsContent value="meus" className="mt-0 space-y-6">

          {error ? (
            <section className="rounded-2xl border border-rose-200 bg-rose-50 px-5 py-4 text-sm text-rose-700">
              {error}
            </section>
          ) : null}

          {submitError && !createOpen && !editOpen && !deleteOpen && !importOpen ? (
            <Aviso tom="ruim" aoFechar={() => setSubmitError(null)}>
              {submitError}
            </Aviso>
          ) : null}

          {avisoDaLista ? (
            <Aviso tom="bom" aoFechar={() => setAvisoDaLista(null)}>
              {avisoDaLista}
            </Aviso>
          ) : null}

          {selectedIds.size > 0 && podeMexerEmFornecedores ? (
            <section className="flex flex-col gap-3 rounded-2xl border border-[rgba(79,70,229,0.30)] bg-[rgba(79,70,229,0.06)] px-5 py-4 sm:flex-row sm:items-center sm:justify-between">
              <div className="text-sm font-medium text-slate-800">
                {selectedIds.size} fornecedor(es) selecionado(s)
              </div>
              <div className="flex flex-wrap items-center gap-2">
                <Button
                  variant="outline"
                  disabled={emMassa}
                  onClick={() => mudarStatusEmMassa("ativo")}
                  className="h-10 rounded-xl border-slate-200 bg-white"
                >
                  Marcar como ativo
                </Button>
                <Button
                  variant="outline"
                  disabled={emMassa}
                  onClick={() => mudarStatusEmMassa("inativo")}
                  className="h-10 rounded-xl border-slate-200 bg-white"
                >
                  Marcar como inativo
                </Button>
                <button
                  type="button"
                  onClick={() => setSelectedIds(new Set())}
                  className="px-2 text-sm font-medium text-slate-600 underline-offset-2 hover:underline"
                >
                  Limpar seleção
                </button>
              </div>
            </section>
          ) : null}

          <section className="overflow-hidden rounded-2xl border border-slate-200 bg-white">
            <div className="max-h-[520px] overflow-auto">
              <table className="w-full border-collapse text-sm">
                <thead className="sticky top-0 z-10 bg-white">
                  <tr className="border-b border-slate-200 text-xs font-semibold text-slate-500">
                    <th className="w-10 px-4 py-3">
                      <button
                        type="button"
                        onClick={() => {
                          setSelectedIds((prev) => {
                            const next = new Set(prev);
                            if (allSelectedOnPage) pageItems.forEach((item) => next.delete(item.id));
                            else pageItems.forEach((item) => next.add(item.id));
                            return next;
                          });
                        }}
                        className={twMerge(
                          "relative inline-flex h-4 w-4 items-center justify-center rounded-sm border transition",
                          allSelectedOnPage || someSelectedOnPage ? "border-[rgba(79,70,229,0.50)] bg-[var(--ks-color-primary)]" : "border-slate-300 bg-white"
                        )}
                      >
                        {allSelectedOnPage ? (
                          <svg viewBox="0 0 24 24" className="h-3.5 w-3.5 text-white">
                            <path d="M20 6L9 17l-5-5" fill="none" stroke="currentColor" strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round" />
                          </svg>
                        ) : someSelectedOnPage ? (
                          <span className="h-0.5 w-2.5 rounded-full bg-white" />
                        ) : null}
                      </button>
                    </th>
                    <th className="px-4 py-3 text-left">Fornecedor</th>
                    <th className="px-4 py-3 text-left">Categoria</th>
                    <th className="px-4 py-3 text-left">Contato</th>
                    <th className="px-4 py-3 text-left">Condições de pagamento</th>
                    <th className="px-4 py-3 text-left">Contas vinculadas</th>
                    <th className="px-4 py-3 text-left">Status</th>
                    <th className="w-16 px-4 py-3 text-right">Ações</th>
                  </tr>
                </thead>
                <tbody>
                  {loading ? (
                    Array.from({ length: PAGE_SIZE }).map((_, index) => (
                      <tr key={index} className="border-b border-slate-100">
                        <td colSpan={8} className="px-4 py-5">
                          <div className="h-12 animate-pulse rounded-2xl bg-slate-100" />
                        </td>
                      </tr>
                    ))
                  ) : pageItems.length === 0 ? (
                    <tr>
                      <td colSpan={8} className="px-4 py-12 text-center text-sm text-slate-500">
                        Nenhum fornecedor encontrado com os filtros atuais.
                      </td>
                    </tr>
                  ) : (
                    pageItems.map((supplier) => {
                      const selected = selectedIds.has(supplier.id);
                      const openBillsLabel =
                        supplier.openBillsTotal > 0
                          ? `${supplier.openBillsCount} conta${supplier.openBillsCount === 1 ? "" : "s"} em aberto`
                          : "Todas pagas";

                      return (
                        <tr key={supplier.id} className={twMerge("border-b border-slate-100 transition hover:bg-slate-50", selected ? "bg-slate-50/70" : "")}>
                          <td className="px-4 py-4">
                            <Checkbox
                              checked={selected}
                              onCheckedChange={(checked) => {
                                setSelectedIds((prev) => {
                                  const next = new Set(prev);
                                  if (checked === true) next.add(supplier.id);
                                  else next.delete(supplier.id);
                                  return next;
                                });
                              }}
                            />
                          </td>
                          <td className="px-4 py-4">
                            <div className="flex items-center gap-3">
                              <div
                                className="flex h-10 w-10 items-center justify-center rounded-xl border border-slate-200 text-xs font-semibold text-slate-700"
                                style={{ backgroundColor: "rgba(79,70,229,0.06)" }}
                              >
                                {getInitials(supplier.name)}
                              </div>
                              <div className="min-w-0">
                                <div className="truncate text-sm font-semibold text-slate-950">{supplier.name}</div>
                                <div className="mt-0.5 text-xs text-slate-500">
                                  {rotuloDoDocumento(supplier.cnpj)}: {formatCnpj(supplier.cnpj)}
                                </div>
                              </div>
                            </div>
                          </td>
                          <td className="px-4 py-4">
                            <div className="text-sm font-medium text-slate-700">{supplier.category}</div>
                            <div className="mt-0.5 text-xs text-slate-500">{supplier.city}</div>
                          </td>
                          <td className="px-4 py-4">
                            <div className="space-y-1 text-sm text-slate-700">
                              <div className="flex items-center gap-2">
                                <Mail className="h-4 w-4 text-slate-400" />
                                <span className="truncate">{supplier.email}</span>
                              </div>
                              <div className="flex items-center gap-2">
                                <Phone className="h-4 w-4 text-slate-400" />
                                <span>{formatPhone(supplier.phone)}</span>
                              </div>
                            </div>
                          </td>
                          <td className="px-4 py-4">
                            <div className="text-sm font-semibold text-slate-900">{supplier.paymentTermsPrimary}</div>
                            <div className="mt-0.5 text-xs text-slate-500">{supplier.paymentTermsSecondary}</div>
                          </td>
                          <td className="px-4 py-4">
                            <div className="inline-flex items-center gap-3 rounded-xl border border-slate-200 bg-white px-3 py-2">
                              <div className="flex h-9 w-9 items-center justify-center rounded-xl bg-slate-50 text-slate-700">
                                <Wallet className="h-4.5 w-4.5" />
                              </div>
                              <div className="min-w-0">
                                <div className="text-sm font-semibold text-slate-950">{money(supplier.openBillsTotal)}</div>
                                <div className="text-xs text-slate-500">{openBillsLabel}</div>
                              </div>
                            </div>
                          </td>
                          <td className="px-4 py-4">
                            <span className={`inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-semibold ${statusBadge(supplier.status)}`}>
                              {supplier.status === "ativo" ? "Ativo" : supplier.status === "pendente" ? "Pendente" : "Inativo"}
                            </span>
                          </td>
                          <td className="px-4 py-4 text-right">
                            <ActionMenu
                              onEdit={() => {
                                setSubmitError(null);
                                setActiveSupplier(supplier);
                                setEditOpen(true);
                              }}
                              onView={() => {
                                setActiveSupplier(supplier);
                                setViewOpen(true);
                              }}
                              onPurchases={() => router.push(`/dashboard/fornecedores/meus-fornecedores/${supplier.id}/compras`)}
                              onPayables={() =>
                                router.push(`/dashboard/financial/payables?supplier_id=${encodeURIComponent(supplier.id)}&supplier=${encodeURIComponent(supplier.name)}`)
                              }
                              onHistory={() => router.push(`/dashboard/fornecedores/meus-fornecedores/${supplier.id}/historico`)}
                              onDelete={() => {
                                setSubmitError(null);
                                setActiveSupplier(supplier);
                                setDeleteOpen(true);
                              }}
                              podeExcluir={podeMexerEmFornecedores}
                            />
                          </td>
                        </tr>
                      );
                    })
                  )}
                </tbody>
              </table>
            </div>

            <div className="flex flex-col gap-3 border-t border-slate-200 bg-white px-4 py-4 sm:flex-row sm:items-center sm:justify-between">
              <div className="text-xs text-slate-500">
                Mostrando {showingStart} a {showingEnd} de {filtered.length} fornecedores
              </div>

              <div className="flex items-center gap-1.5">
                <button
                  type="button"
                  onClick={() => setPage((p) => Math.max(1, p - 1))}
                  className="inline-flex h-9 w-9 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-600 transition hover:bg-slate-50 disabled:opacity-50"
                  disabled={page <= 1}
                >
                  <ArrowDown className="h-4 w-4 rotate-90" />
                </button>
                {Array.from({ length: Math.min(5, pages) }).map((_, index) => {
                  const pageNumber =
                    pages <= 5 ? index + 1 : page <= 3 ? index + 1 : page >= pages - 2 ? pages - 4 + index : page - 2 + index;
                  const isActivePage = pageNumber === page;
                  return (
                    <button
                      key={pageNumber}
                      type="button"
                      onClick={() => setPage(pageNumber)}
                      className={twMerge(
                        "inline-flex h-9 w-9 items-center justify-center rounded-lg border text-sm font-semibold transition",
                        isActivePage
                          ? "border-[rgba(79,70,229,0.35)] bg-[rgba(79,70,229,0.10)] text-[var(--ks-color-primary)]"
                          : "border-slate-200 bg-white text-slate-700 hover:bg-slate-50"
                      )}
                    >
                      {pageNumber}
                    </button>
                  );
                })}
                <button
                  type="button"
                  onClick={() => setPage((p) => Math.min(pages, p + 1))}
                  className="inline-flex h-9 w-9 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-600 transition hover:bg-slate-50 disabled:opacity-50"
                  disabled={page >= pages}
                >
                  <ArrowUp className="h-4 w-4 rotate-90" />
                </button>
              </div>
            </div>
          </section>
        </TabsContent>
      </Tabs>

      <Dialog open={filtersOpen} onOpenChange={setFiltersOpen}>
        <DialogContent className="w-[96vw] max-w-[720px] overflow-visible rounded-2xl border-slate-200 p-0">
          <DialogHeader className="border-b border-slate-200 px-5 py-4">
            <DialogTitle className="text-base font-semibold tracking-[-0.02em]">Mais filtros</DialogTitle>
            <DialogDescription className="text-sm text-slate-500">Ajuste a lista mantendo a mesma densidade visual.</DialogDescription>
          </DialogHeader>

          <div className="grid gap-5 px-5 py-5 md:grid-cols-2">
            <label className="space-y-2">
              <div className="text-sm font-medium text-slate-900">Somente com contas em aberto</div>
              <button
                type="button"
                onClick={() => setOnlyWithOpenBills((prev) => !prev)}
                className={twMerge(
                  "flex h-11 w-full items-center justify-between rounded-xl border px-3 text-sm transition",
                  onlyWithOpenBills ? "border-emerald-200 bg-emerald-50 text-emerald-800" : "border-slate-200 bg-white text-slate-700"
                )}
              >
                <span>{onlyWithOpenBills ? "Ativo" : "Desativado"}</span>
                <span className={twMerge("inline-flex h-5 w-9 items-center rounded-full p-0.5", onlyWithOpenBills ? "bg-emerald-500" : "bg-slate-200")}>
                  <span className={twMerge("h-4 w-4 rounded-full bg-white transition", onlyWithOpenBills ? "translate-x-4" : "translate-x-0")} />
                </span>
              </button>
            </label>

            <label className="space-y-2">
              <div className="text-sm font-medium text-slate-900">Forma de pagamento</div>
              <CustomSelect
                value={paymentMethodFilter}
                onChange={(value) => setPaymentMethodFilter(value as typeof paymentMethodFilter)}
                options={[
                  { value: "todos", label: "Todas" },
                  { value: "boleto", label: "Boleto" },
                  { value: "pix", label: "PIX" },
                  { value: "cartao", label: "Cartão" },
                ]}
                className="h-11 rounded-xl border-slate-200 bg-white"
              />
            </label>

            <label className="space-y-2 md:col-span-2">
              <div className="text-sm font-medium text-slate-900">CNPJ ou CPF exato</div>
              <Input
                value={formatCnpj(cnpjFilter)}
                onChange={(e) => setCnpjFilter(digits(e.target.value))}
                placeholder="00.000.000/0000-00"
                className="h-11 rounded-xl border-slate-200 bg-white"
              />
            </label>
          </div>

          <DialogFooter className="border-t border-slate-200 px-5 py-4">
            <Button
              variant="outline"
              onClick={() => {
                setOnlyWithOpenBills(false);
                setPaymentMethodFilter("todos");
                setCnpjFilter("");
                setFiltersOpen(false);
              }}
              className="h-11 rounded-xl border-slate-200 bg-white"
            >
              Limpar
            </Button>
            <Button onClick={() => setFiltersOpen(false)} className="h-11 rounded-xl" style={{ backgroundColor: kPurple }}>
              Aplicar
            </Button>
          </DialogFooter>
        </DialogContent>
      </Dialog>

      <SupplierFormDialog
        open={createOpen}
        onOpenChange={(value) => {
          setCreateOpen(value);
          if (!value) setSubmitError(null);
        }}
        title="Novo fornecedor"
        description="Cadastre um fornecedor e vincule condições e financeiro."
        submitLabel="Criar fornecedor"
        loading={saving}
        error={submitError}
        initial={null}
        categoryHints={categoryHints}
        cityHints={cityHints}
        onSubmit={handleCreate}
      />

      <SupplierFormDialog
        open={editOpen}
        onOpenChange={(value) => {
          setEditOpen(value);
          if (!value) {
            setActiveSupplier(null);
            setSubmitError(null);
          }
        }}
        title="Editar fornecedor"
        description="Atualize dados, condições de pagamento e status."
        submitLabel="Salvar alterações"
        loading={saving}
        error={submitError}
        initial={activeSupplier}
        categoryHints={categoryHints}
        cityHints={cityHints}
        onSubmit={handleUpdate}
      />

      <ImportDialog
        open={importOpen}
        onOpenChange={(value) => {
          setImportOpen(value);
          if (!value) {
            setSubmitError(null);
            setResultadoDaImportacao(null);
          }
        }}
        busy={importing}
        error={submitError}
        resultado={resultadoDaImportacao}
        onImport={handleImport}
      />

      <ViewDialog
        open={viewOpen}
        onOpenChange={(value) => {
          setViewOpen(value);
          if (!value) setActiveSupplier(null);
        }}
        supplier={activeSupplier}
        onGoPayables={(supplier) => router.push(`/dashboard/financial/payables?supplier_id=${encodeURIComponent(supplier.id)}&supplier=${encodeURIComponent(supplier.name)}`)}
      />

      <Dialog
        open={deleteOpen}
        onOpenChange={(value) => {
          setDeleteOpen(value);
          if (!value) {
            setActiveSupplier(null);
            setSubmitError(null);
          }
        }}
      >
        <DialogContent className="w-[96vw] max-w-[520px] overflow-visible rounded-2xl border-slate-200 p-0">
          <DialogHeader className="border-b border-slate-200 px-5 py-4">
            <DialogTitle className="text-base font-semibold tracking-[-0.02em]">Confirmar exclusão</DialogTitle>
            <DialogDescription className="text-sm text-slate-500">Essa ação remove o fornecedor da sua lista sem apagar o histórico financeiro.</DialogDescription>
          </DialogHeader>
          <div className="px-5 py-5">
            <div className="rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">
              {activeSupplier ? (
                <>
                  Você está prestes a remover <strong>{activeSupplier.name}</strong>. As contas já registradas continuam existindo e auditáveis.
                </>
              ) : (
                "Selecione um fornecedor para deletar."
              )}
            </div>
            {submitError ? <div className="mt-3 text-sm text-rose-600">{submitError}</div> : null}
          </div>
          <DialogFooter className="border-t border-slate-200 px-5 py-4">
            <Button variant="outline" onClick={() => setDeleteOpen(false)} className="h-11 rounded-xl border-slate-200 bg-white">
              Cancelar
            </Button>
            <Button
              variant="destructive"
              onClick={handleDelete}
              disabled={saving}
              className="h-11 rounded-xl"
              icon={<Trash2 className="h-4.5 w-4.5" />}
            >
              {saving ? "Deletando..." : "Deletar"}
            </Button>
          </DialogFooter>
        </DialogContent>
      </Dialog>
    </main>
  );
}
