"use client";

import { useCallback, useEffect, useMemo, useState } from "react";
import { Check, Loader2, Package, Search, Wrench, X } from "lucide-react";

import { pedirFiscal } from "@/components/fiscal/comum";
import { Dica } from "@/components/fiscal/dica";
import { pedeCest } from "@/lib/fiscal/tabelas";
import { Aviso } from "@/components/ui/aviso";
import { CustomSelect } from "@/components/ui/custom-select";
import { Dialog, DialogContent, DialogDescription, DialogTitle } from "@/components/ui/dialog";
import type { ProdutoFiscal, ServicoFiscal } from "@/lib/fiscal/servidor/produtos";

import { soDigitos, type PainelNaTela } from "./campos";

type MudancaDeProduto = Partial<Pick<ProdutoFiscal, "fiscalTipo" | "ncm" | "cest" | "perfilId">>;
type MudancaDeServico = Partial<Pick<ServicoFiscal, "fiscalTipo" | "perfilId">>;

function cestFormatado(valor: string | null | undefined) {
  const d = soDigitos(valor).slice(0, 7);
  if (d.length <= 2) return d;
  if (d.length <= 5) return `${d.slice(0, 2)}.${d.slice(2)}`;
  return `${d.slice(0, 2)}.${d.slice(2, 5)}.${d.slice(5)}`;
}

function ncmFormatado(valor: string | null | undefined) {
  const d = soDigitos(valor).slice(0, 8);
  if (d.length <= 4) return d;
  if (d.length <= 6) return `${d.slice(0, 4)}.${d.slice(4)}`;
  return `${d.slice(0, 4)}.${d.slice(4, 6)}.${d.slice(6)}`;
}

/**
 * Os produtos e o código fiscal de cada um (NCM). Todo produto que sai em nota
 * de produto ou cupom fiscal precisa dele; o que é serviço sai na nota de
 * serviço e dispensa o código.
 */
export function ProdutosSemNcm({ painel, aoFechar, aoSalvar }: { painel: PainelNaTela; aoFechar: () => void; aoSalvar: () => Promise<unknown> }) {
  const [produtos, setProdutos] = useState<ProdutoFiscal[]>([]);
  const [servicos, setServicos] = useState<ServicoFiscal[]>([]);
  const [carregando, setCarregando] = useState(true);
  const [erro, setErro] = useState<string | null>(null);
  const [ok, setOk] = useState<string | null>(null);
  const [filtro, setFiltro] = useState<"falta" | "todos" | "servicos">("falta");
  const [busca, setBusca] = useState("");
  const [mudancas, setMudancas] = useState<Record<string, MudancaDeProduto>>({});
  const [mudancasDeServico, setMudancasDeServico] = useState<Record<string, MudancaDeServico>>({});
  const [selecionados, setSelecionados] = useState<Set<string>>(new Set());
  const [salvando, setSalvando] = useState(false);
  const [ncmEmLote, setNcmEmLote] = useState("");
  const [buscaNcm, setBuscaNcm] = useState<{ produtoId: string | "lote"; termo: string } | null>(null);
  const [resultadosNcm, setResultadosNcm] = useState<Array<{ codigo: string; descricao: string }>>([]);
  const [buscandoNcm, setBuscandoNcm] = useState(false);

  const perfisDeMercadoria = painel.perfis.filter((p) => p.ativo && p.tipo === "mercadoria");
  /* O CEST só aparece para produto com substituição tributária — para os outros
     seria mais um código sem sentido na tela. */
  const precisaDeCest = (perfilId: string | null | undefined) => {
    const perfil = perfilId ? painel.perfis.find((p) => p.id === perfilId) : painel.perfis.find((p) => p.padrao && p.tipo === "mercadoria");
    if (!perfil) return false;
    const regras = perfil.regras as { cstIcms?: number | null; csosn?: number | null };
    return pedeCest({ cstIcms: regras?.cstIcms ?? null, csosn: regras?.csosn ?? null });
  };
  const perfisDeServico = painel.perfis.filter((p) => p.ativo && p.tipo === "servico");
  const nfseLigada = Boolean(painel.emissor?.nfse.ativo);

  const carregar = useCallback(async () => {
    setCarregando(true);
    try {
      const json = await pedirFiscal<{ produtos: ProdutoFiscal[]; servicos: ServicoFiscal[] }>("/api/fiscal/produtos");
      setProdutos(json.produtos);
      setServicos(json.servicos);
    } catch (e) {
      setErro(e instanceof Error ? e.message : "Não foi possível carregar os produtos.");
    } finally {
      setCarregando(false);
    }
  }, []);

  useEffect(() => {
    void carregar();
  }, [carregar]);

  useEffect(() => {
    if (!buscaNcm || buscaNcm.termo.trim().length < 3) return;
    const relogio = setTimeout(async () => {
      setBuscandoNcm(true);
      try {
        const json = await pedirFiscal<{ resultados: Array<{ codigo: string; descricao: string }> }>(`/api/fiscal/consultas/ncm?q=${encodeURIComponent(buscaNcm.termo.trim())}`);
        setResultadosNcm(json.resultados);
      } catch {
        setResultadosNcm([]);
      } finally {
        setBuscandoNcm(false);
      }
    }, 350);
    return () => clearTimeout(relogio);
  }, [buscaNcm]);

  const atual = useCallback((produto: ProdutoFiscal): ProdutoFiscal => ({ ...produto, ...(mudancas[produto.id] ?? {}) }), [mudancas]);

  const visiveis = useMemo(() => {
    const termo = busca.trim().toLowerCase();
    return produtos
      .map(atual)
      .filter((p) => p.ativo || mudancas[p.id])
      .filter((p) => {
        if (filtro === "servicos") return p.fiscalTipo === "servico";
        if (filtro === "falta") return p.fiscalTipo !== "servico" && soDigitos(p.ncm).length !== 8;
        return true;
      })
      .filter((p) => !termo || p.nome.toLowerCase().includes(termo) || (p.sku ?? "").toLowerCase().includes(termo));
  }, [produtos, atual, filtro, busca, mudancas]);

  const semNcm = produtos.map(atual).filter((p) => p.ativo && p.fiscalTipo !== "servico" && soDigitos(p.ncm).length !== 8).length;
  const quantasMudancas = Object.keys(mudancas).length + Object.keys(mudancasDeServico).length;

  const mudar = (id: string, parcial: MudancaDeProduto) => {
    setOk(null);
    setMudancas((antes) => ({ ...antes, [id]: { ...(antes[id] ?? {}), ...parcial } }));
  };

  const aplicarNcmEmLote = (codigo: string) => {
    const ncm = soDigitos(codigo);
    if (ncm.length !== 8 || !selecionados.size) return;
    setMudancas((antes) => {
      const proximo = { ...antes };
      for (const id of selecionados) proximo[id] = { ...(proximo[id] ?? {}), ncm, fiscalTipo: "mercadoria" };
      return proximo;
    });
    setSelecionados(new Set());
    setNcmEmLote("");
  };

  const salvar = async () => {
    const invalido = Object.entries(mudancas).find(([, m]) => m.ncm && soDigitos(m.ncm).length !== 8);
    if (invalido) {
      setErro("Há código fiscal com menos de 8 números. Complete ou apague antes de salvar.");
      return;
    }
    setSalvando(true);
    setErro(null);
    try {
      const json = await pedirFiscal<{ produtos: number; servicos: number }>("/api/fiscal/produtos", {
        method: "PATCH",
        json: {
          produtos: Object.entries(mudancas).map(([id, m]) => ({
            id,
            ...m,
            ncm: m.ncm === undefined ? undefined : soDigitos(m.ncm) || null,
            cest: m.cest === undefined ? undefined : soDigitos(m.cest) || null,
          })),
          servicos: Object.entries(mudancasDeServico).map(([id, m]) => ({ id, ...m })),
        },
      });
      setMudancas({});
      setMudancasDeServico({});
      await Promise.all([carregar(), aoSalvar()]);
      const total = json.produtos + json.servicos;
      setOk(`${total} ${total === 1 ? "cadastro atualizado" : "cadastros atualizados"}.`);
    } catch (e) {
      setErro(e instanceof Error ? e.message : "Não foi possível salvar.");
    } finally {
      setSalvando(false);
    }
  };

  return (
    <Dialog open onOpenChange={(v) => !v && !salvando && aoFechar()}>
      <DialogContent
        hideClose
        className="flex h-[92vh] w-[calc(100vw-24px)] max-w-[1280px] flex-col gap-0 overflow-hidden rounded-[28px] border-0 bg-[var(--ks-color-bg-elevated)] p-0 shadow-[0_30px_80px_rgba(26,26,43,0.28)]"
      >
        <DialogTitle className="sr-only">Código fiscal dos produtos</DialogTitle>
        <DialogDescription className="sr-only">Informar o NCM de cada produto.</DialogDescription>

        <header className="flex items-center gap-4 border-b border-[var(--ks-color-border-subtle)] px-6 py-5">
          <span className="flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-violet-500 to-purple-600 text-white">
            <Package size={22} />
          </span>
          <div className="min-w-0 flex-1">
            <h2 className="text-xl font-extrabold text-[var(--ks-color-text-primary)]">Código fiscal dos produtos (NCM)</h2>
            <p className="text-sm text-[var(--ks-color-text-muted)]">
              Todo produto que sai em nota precisa do código de 8 números. Marque vários e aplique o mesmo código de uma vez. O que for serviço dispensa o código.
            </p>
          </div>
          <button type="button" onClick={aoFechar} className="rounded-full p-2 text-[var(--ks-color-text-soft)] hover:bg-[var(--ks-color-bg-hover)]" aria-label="Fechar">
            <X size={20} />
          </button>
        </header>

        <div className="flex flex-wrap items-center gap-3 border-b border-[var(--ks-color-border-subtle)] px-6 py-3">
          <div className="flex gap-6">
            {[
              { chave: "falta" as const, rotulo: "Sem código", quantos: semNcm },
              { chave: "todos" as const, rotulo: "Todos", quantos: null },
              { chave: "servicos" as const, rotulo: "Serviços", quantos: null },
            ].map((opcao) => (
              <button
                key={opcao.chave}
                type="button"
                onClick={() => setFiltro(opcao.chave)}
                className={`-mb-3 border-b-2 pb-3 text-sm font-bold transition ${
                  filtro === opcao.chave ? "border-[var(--ks-color-primary)] text-[var(--ks-color-text-primary)]" : "border-transparent text-[var(--ks-color-text-muted)] hover:text-[var(--ks-color-text-primary)]"
                }`}
              >
                {opcao.rotulo}
                {opcao.quantos ? <span className="ml-1.5 rounded-full bg-rose-500 px-1.5 py-0.5 text-[10px] text-white">{opcao.quantos}</span> : null}
              </button>
            ))}
          </div>
          <div className="relative ml-auto w-full max-w-sm">
            <Search size={15} className="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-[var(--ks-color-text-soft)]" />
            <input value={busca} onChange={(e) => setBusca(e.target.value)} placeholder="Buscar produto" className="ks-field" style={{ paddingLeft: "2.25rem" }} />
          </div>
        </div>

        {selecionados.size ? (
          <div className="flex flex-wrap items-center gap-3 bg-[var(--ks-color-primary)] px-6 py-3 text-white">
            <span className="text-sm font-bold">
              {selecionados.size} {selecionados.size === 1 ? "selecionado" : "selecionados"}
            </span>
            <input
              value={ncmFormatado(ncmEmLote)}
              onChange={(e) => setNcmEmLote(soDigitos(e.target.value).slice(0, 8))}
              placeholder="Código para todos"
              inputMode="numeric"
              className="h-9 w-40 rounded-xl border-0 bg-white/15 px-3 text-sm tabular-nums text-white placeholder:text-white/60 outline-none focus:bg-white/25"
            />
            <button type="button" onClick={() => setBuscaNcm({ produtoId: "lote", termo: "" })} className="rounded-xl bg-white/15 px-3 py-2 text-xs font-bold hover:bg-white/25">
              Procurar código
            </button>
            <button type="button" disabled={ncmEmLote.length !== 8} onClick={() => aplicarNcmEmLote(ncmEmLote)} className="rounded-xl bg-white px-3 py-2 text-xs font-bold text-[var(--ks-color-primary)] disabled:opacity-50">
              Aplicar
            </button>
            <button
              type="button"
              onClick={() => {
                setMudancas((antes) => {
                  const proximo = { ...antes };
                  for (const id of selecionados) proximo[id] = { ...(proximo[id] ?? {}), fiscalTipo: "servico" };
                  return proximo;
                });
                setSelecionados(new Set());
              }}
              className="rounded-xl bg-white/15 px-3 py-2 text-xs font-bold hover:bg-white/25"
            >
              Marcar como serviço
            </button>
            <button type="button" onClick={() => setSelecionados(new Set())} className="ml-auto rounded-full p-1.5 hover:bg-white/20" aria-label="Limpar seleção">
              <X size={16} />
            </button>
          </div>
        ) : null}

        <div className="min-h-0 flex-1 overflow-y-auto">
          {erro ? (
            <div className="px-6 pt-4">
              <Aviso tom="ruim" aoFechar={() => setErro(null)}>
                {erro}
              </Aviso>
            </div>
          ) : null}
          {ok ? (
            <div className="px-6 pt-4">
              <Aviso tom="bom" aoFechar={() => setOk(null)}>
                {ok}
              </Aviso>
            </div>
          ) : null}

          {carregando ? (
            <div className="flex justify-center py-16">
              <Loader2 className="h-7 w-7 animate-spin text-[var(--ks-color-primary)]" />
            </div>
          ) : visiveis.length === 0 ? (
            <p className="flex items-center justify-center gap-2 px-6 py-16 text-sm text-[var(--ks-color-text-muted)]">
              {filtro === "falta" ? (
                <>
                  <Check size={16} className="text-emerald-600" /> Todos os produtos ativos têm código fiscal.
                </>
              ) : (
                "Nenhum produto aqui."
              )}
            </p>
          ) : (
            <div className="overflow-x-auto px-3">
              <div className="min-w-[820px]">
                <div className="grid grid-cols-[32px_minmax(0,1fr)_180px_210px_240px] gap-4 px-3 py-3 text-[10px] font-semibold uppercase tracking-[0.14em] text-slate-400">
                  <input
                    type="checkbox"
                    aria-label="Selecionar todos"
                    checked={visiveis.length > 0 && visiveis.every((p) => selecionados.has(p.id))}
                    onChange={(e) => setSelecionados(e.target.checked ? new Set(visiveis.map((p) => p.id)) : new Set())}
                    className="h-4 w-4 accent-[var(--ks-color-primary)]"
                  />
                  <span>Produto</span>
                  <span>Sai na nota como</span>
                  <span>Código fiscal (NCM)</span>
                  <span>Tributação</span>
                </div>
                {visiveis.map((produto) => {
                  const alterado = Boolean(mudancas[produto.id]);
                  const servico = produto.fiscalTipo === "servico";
                  const ncm = soDigitos(produto.ncm);
                  return (
                    <div
                      key={produto.id}
                      className="grid grid-cols-[32px_minmax(0,1fr)_180px_210px_240px] items-center gap-4 border-t border-slate-100/60 px-3 py-2.5 transition-colors hover:bg-[var(--ks-color-bg-subtle)]/50"
                    >
                      <input
                        type="checkbox"
                        checked={selecionados.has(produto.id)}
                        onChange={(e) =>
                          setSelecionados((antes) => {
                            const proximo = new Set(antes);
                            if (e.target.checked) proximo.add(produto.id);
                            else proximo.delete(produto.id);
                            return proximo;
                          })
                        }
                        className="h-4 w-4 accent-[var(--ks-color-primary)]"
                      />
                      <div className="flex min-w-0 items-center gap-3">
                        {produto.imagem ? (
                          // eslint-disable-next-line @next/next/no-img-element
                          <img src={produto.imagem} alt="" className="h-10 w-10 shrink-0 rounded-xl object-cover" />
                        ) : (
                          <span className="flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-[var(--ks-color-bg-inset)] text-[var(--ks-color-text-soft)]">
                            <Package size={16} />
                          </span>
                        )}
                        <div className="min-w-0">
                          <p className="truncate text-sm font-semibold text-[var(--ks-color-text-primary)]">
                            {produto.nome}
                            {alterado ? <span className="ml-2 text-[10px] font-bold uppercase text-[var(--ks-color-primary)]">alterado</span> : null}
                          </p>
                          {produto.sku ? <p className="truncate text-[11px] text-[var(--ks-color-text-soft)]">{produto.sku}</p> : null}
                        </div>
                      </div>
                      <div className="inline-flex rounded-xl bg-[var(--ks-color-bg-inset)] p-0.5">
                        {(["mercadoria", "servico"] as const).map((tipo) => (
                          <button
                            key={tipo}
                            type="button"
                            onClick={() => mudar(produto.id, { fiscalTipo: tipo, perfilId: null })}
                            className={`rounded-[10px] px-3 py-1.5 text-xs font-bold transition ${
                              (produto.fiscalTipo ?? "mercadoria") === tipo ? "bg-[var(--ks-color-bg-elevated)] text-[var(--ks-color-primary)] shadow-sm" : "text-[var(--ks-color-text-muted)]"
                            }`}
                          >
                            {tipo === "mercadoria" ? "Produto" : "Serviço"}
                          </button>
                        ))}
                      </div>
                      <div className="flex items-center gap-1">
                        {servico ? (
                          <span className="text-xs text-[var(--ks-color-text-soft)]">não precisa</span>
                        ) : (
                          <>
                            <input
                              value={ncmFormatado(produto.ncm)}
                              onChange={(e) => mudar(produto.id, { ncm: soDigitos(e.target.value).slice(0, 8) })}
                              placeholder="0000.00.00"
                              inputMode="numeric"
                              className={`ks-field tabular-nums ${ncm.length && ncm.length !== 8 ? "text-rose-600" : ""}`}
                            />
                            <button
                              type="button"
                              onClick={() => {
                                setResultadosNcm([]);
                                setBuscaNcm({ produtoId: produto.id, termo: produto.nome.split(" ").slice(0, 2).join(" ") });
                              }}
                              className="shrink-0 rounded-lg p-2 text-[var(--ks-color-text-soft)] hover:bg-[var(--ks-color-bg-hover)] hover:text-[var(--ks-color-primary)]"
                              aria-label="Procurar código"
                              title="Procurar código pelo nome"
                            >
                              <Search size={15} />
                            </button>
                          </>
                        )}
                      </div>
                      <div className="flex flex-col gap-1">
                        <CustomSelect
                          size="sm"
                          options={[{ value: "", label: "A principal da empresa" }, ...(servico ? perfisDeServico : perfisDeMercadoria).map((p) => ({ value: p.id, label: p.nome }))]}
                          value={produto.perfilId ?? ""}
                          onChange={(v) => mudar(produto.id, { perfilId: v || null })}
                        />
                        {!servico && precisaDeCest(produto.perfilId) ? (
                          <label className="flex items-center gap-2">
                            <span className="flex shrink-0 items-baseline text-[11px] font-semibold text-[var(--ks-color-text-soft)]">
                              CEST
                              <Dica titulo="CEST" link="cest">
                                Código de sete dígitos que acompanha o NCM em produto com substituição tributária. Quem diz qual é o do seu
                                produto é a tabela oficial do Convênio ICMS 142/2018.
                              </Dica>
                            </span>
                            <input
                              value={cestFormatado(produto.cest)}
                              onChange={(e) => mudar(produto.id, { cest: soDigitos(e.target.value).slice(0, 7) })}
                              placeholder="00.000.00"
                              inputMode="numeric"
                              className={`ks-field h-8 text-xs tabular-nums ${soDigitos(produto.cest).length && soDigitos(produto.cest).length !== 7 ? "text-rose-600" : ""}`}
                            />
                          </label>
                        ) : null}
                      </div>
                    </div>
                  );
                })}
              </div>
            </div>
          )}

          {servicos.length && (nfseLigada || servicos.some((s) => s.fiscalTipo === "servico")) ? (
            <section className="space-y-2 border-t border-[var(--ks-color-border-subtle)] px-6 py-5">
              <h3 className="flex items-center gap-2 text-base font-extrabold text-[var(--ks-color-text-primary)]">
                <Wrench size={16} className="text-[var(--ks-color-primary)]" /> Serviços opcionais dos produtos
              </h3>
              <p className="text-sm text-[var(--ks-color-text-muted)]">Instalação, arte e outros serviços marcados no pedido. Na nota de serviço, o valor deles sai da nota do produto.</p>
              <ul>
                {servicos.map((servicoOriginal) => {
                  const servico = { ...servicoOriginal, ...(mudancasDeServico[servicoOriginal.id] ?? {}) };
                  const naNfse = servico.fiscalTipo === "servico";
                  return (
                    <li key={servico.id} className="flex flex-wrap items-center gap-3 border-t border-slate-100/60 py-2.5 first:border-t-0">
                      <span className="min-w-0 flex-1 truncate text-sm font-semibold text-[var(--ks-color-text-primary)]">{servico.titulo}</span>
                      <div className="inline-flex rounded-xl bg-[var(--ks-color-bg-inset)] p-0.5">
                        {([
                          { valor: "produto", rotulo: "No preço do produto" },
                          { valor: "servico", rotulo: "Na nota de serviço" },
                        ] as const).map((opcao) => (
                          <button
                            key={opcao.valor}
                            type="button"
                            onClick={() => {
                              setOk(null);
                              setMudancasDeServico((antes) => ({ ...antes, [servico.id]: { ...(antes[servico.id] ?? {}), fiscalTipo: opcao.valor } }));
                            }}
                            className={`rounded-[10px] px-3 py-1.5 text-xs font-bold transition ${
                              (servico.fiscalTipo ?? "produto") === opcao.valor ? "bg-[var(--ks-color-bg-elevated)] text-[var(--ks-color-primary)] shadow-sm" : "text-[var(--ks-color-text-muted)]"
                            }`}
                          >
                            {opcao.rotulo}
                          </button>
                        ))}
                      </div>
                      {naNfse ? (
                        <div className="w-60">
                          <CustomSelect
                            size="sm"
                            options={[{ value: "", label: "A principal de serviço" }, ...perfisDeServico.map((p) => ({ value: p.id, label: p.nome }))]}
                            value={servico.perfilId ?? ""}
                            onChange={(v) => setMudancasDeServico((antes) => ({ ...antes, [servico.id]: { ...(antes[servico.id] ?? {}), perfilId: v || null } }))}
                          />
                        </div>
                      ) : null}
                    </li>
                  );
                })}
              </ul>
            </section>
          ) : null}
        </div>

        <footer className="flex items-center justify-between gap-3 border-t border-[var(--ks-color-border-subtle)] px-6 py-4">
          <p className="text-sm text-[var(--ks-color-text-muted)]">
            {quantasMudancas ? (
              <>
                <strong className="ks-num text-[var(--ks-color-text-primary)]">{quantasMudancas}</strong> {quantasMudancas === 1 ? "alteração" : "alterações"} para salvar
              </>
            ) : semNcm ? (
              <>
                <strong className="ks-num text-rose-600">{semNcm}</strong> {semNcm === 1 ? "produto ativo sem código" : "produtos ativos sem código"}
              </>
            ) : (
              "Todos os produtos prontos para a nota."
            )}
          </p>
          <div className="flex gap-2">
            <button type="button" onClick={aoFechar} className="ks-button ks-button-ghost">
              Fechar
            </button>
            <button type="button" onClick={() => void salvar()} disabled={!quantasMudancas || salvando} className="ks-button ks-button-primary">
              {salvando ? <Loader2 size={16} className="animate-spin" /> : null}
              Salvar
            </button>
          </div>
        </footer>

        {buscaNcm ? (
          <div className="fixed inset-0 z-[120] flex items-start justify-center bg-[rgba(12,8,24,0.42)] p-4 pt-[10vh] backdrop-blur-[2px]" onClick={() => setBuscaNcm(null)}>
            <div onClick={(e) => e.stopPropagation()} className="w-full max-w-xl overflow-hidden rounded-[20px] bg-[var(--ks-color-bg-elevated)] shadow-[0_24px_60px_rgba(26,26,43,0.28)]">
              <div className="flex items-center gap-2 border-b border-[var(--ks-color-border-subtle)] px-4 py-3">
                <Search size={16} className="text-[var(--ks-color-primary)]" />
                <input
                  autoFocus
                  value={buscaNcm.termo}
                  onChange={(e) => setBuscaNcm({ ...buscaNcm, termo: e.target.value })}
                  placeholder="Ex.: adesivo, lona, cartão, camiseta"
                  className="flex-1 bg-transparent text-sm outline-none"
                />
                {buscandoNcm ? <Loader2 size={15} className="animate-spin text-[var(--ks-color-primary)]" /> : null}
                <button type="button" onClick={() => setBuscaNcm(null)} className="rounded-full p-1 text-[var(--ks-color-text-soft)] hover:bg-[var(--ks-color-bg-hover)]" aria-label="Fechar">
                  <X size={16} />
                </button>
              </div>
              <ul className="max-h-[50vh] overflow-y-auto py-1">
                {buscaNcm.termo.trim().length >= 3
                  ? resultadosNcm.map((item) => (
                      <li key={item.codigo}>
                        <button
                          type="button"
                          onClick={() => {
                            if (buscaNcm.produtoId === "lote") setNcmEmLote(item.codigo);
                            else mudar(buscaNcm.produtoId, { ncm: item.codigo, fiscalTipo: "mercadoria" });
                            setBuscaNcm(null);
                          }}
                          className="block w-full px-4 py-2.5 text-left text-sm leading-5 text-[var(--ks-color-text-primary)] hover:bg-[var(--ks-color-bg-hover)]"
                        >
                          {item.descricao}
                        </button>
                      </li>
                    ))
                  : null}
                {!buscandoNcm && buscaNcm.termo.trim().length >= 3 && !resultadosNcm.length ? (
                  <li className="px-4 py-6 text-center text-sm text-[var(--ks-color-text-muted)]">Nada encontrado. Tente outra palavra.</li>
                ) : null}
              </ul>
              <p className="border-t border-[var(--ks-color-border-subtle)] px-4 py-2.5 text-xs leading-5 text-[var(--ks-color-text-soft)]">
                Busca na tabela oficial da Receita. Na dúvida sobre o código certo, confirme com o seu contador.
              </p>
            </div>
          </div>
        ) : null}
      </DialogContent>
    </Dialog>
  );
}
