"use client";

import { useEffect, useRef, useState } from "react";
import { Check, ChevronDown, Loader2 } from "lucide-react";

/**
 * O botão de status do pedido: o de maior hierarquia no cabeçalho.
 *
 * Mostra a próxima etapa como ação ("Iniciar produção") e, ao abrir, o menu
 * com todos os status, o atual marcado. Trocar de status é uma decisão
 * grande — manda WhatsApp para o cliente — então fica num lugar só, sem
 * select escondido num cartão lateral.
 */

export type OpcaoDeStatus = { value: string; label: string };

const PROXIMA: Record<string, { value: string; label: string }> = {
  pending_production: { value: "in_production", label: "Iniciar produção" },
  in_production: { value: "finished", label: "Finalizar produção" },
  finished: { value: "delivered", label: "Marcar como entregue" },
};

export function BotaoDeStatus({
  status,
  opcoes,
  pdv,
  disabled,
  atualizando,
  onChange,
}: {
  status: string;
  opcoes: OpcaoDeStatus[];
  pdv: boolean;
  disabled: boolean;
  atualizando: boolean;
  onChange: (status: string) => void | Promise<void>;
}) {
  const [aberto, setAberto] = useState(false);
  const caixa = useRef<HTMLDivElement | null>(null);

  useEffect(() => {
    if (!aberto) return;
    const fechar = (e: MouseEvent) => {
      if (caixa.current && !caixa.current.contains(e.target as Node)) setAberto(false);
    };
    const tecla = (e: KeyboardEvent) => {
      if (e.key === "Escape") setAberto(false);
    };
    document.addEventListener("mousedown", fechar);
    document.addEventListener("keydown", tecla);
    return () => {
      document.removeEventListener("mousedown", fechar);
      document.removeEventListener("keydown", tecla);
    };
  }, [aberto]);

  if (pdv) {
    return (
      <span className={`ks-chip ${status === "canceled" ? "ks-chip-danger" : "ks-chip-success"}`}>
        {status === "canceled" ? "Venda cancelada no PDV" : "Venda concluída no PDV"}
      </span>
    );
  }

  const atual = opcoes.find((o) => o.value === status);
  const proxima = PROXIMA[status];
  const concluido = status === "delivered" || status === "canceled";

  const escolher = (valor: string) => {
    setAberto(false);
    if (valor !== status) void onChange(valor);
  };

  return (
    <div ref={caixa} className="relative">
      <button
        type="button"
        onClick={() => setAberto((a) => !a)}
        disabled={disabled}
        aria-haspopup="menu"
        aria-expanded={aberto}
        className={`ks-button ${concluido ? "ks-button-secondary" : "ks-button-primary"} inline-flex w-full items-center justify-center gap-2 sm:w-auto`}
        title="Mudar o status do pedido"
      >
        {atualizando ? <Loader2 size={16} className="animate-spin" /> : null}
        <span>{proxima ? proxima.label : atual?.label ?? status}</span>
        <ChevronDown size={16} className={`transition-transform ${aberto ? "rotate-180" : ""}`} />
      </button>

      {aberto ? (
        <div
          role="menu"
          className="absolute left-0 right-0 z-50 mt-2 overflow-hidden rounded-xl sm:left-auto sm:w-64 border border-[var(--ks-color-border-subtle)] bg-[var(--ks-color-bg-elevated)] shadow-[var(--ks-shadow-overlay)]"
        >
          {proxima ? (
            <div className="border-b border-[var(--ks-color-border-subtle)] p-2">
              <div className="px-2 pb-1 text-[10px] font-semibold uppercase tracking-wide text-[var(--ks-color-text-soft)]">
                Próxima etapa
              </div>
              <button
                type="button"
                role="menuitem"
                onClick={() => escolher(proxima.value)}
                className="flex w-full items-center justify-between rounded-lg bg-[var(--ks-color-primary)] px-3 py-2 text-left text-sm font-semibold text-white hover:opacity-90"
              >
                {proxima.label}
              </button>
            </div>
          ) : null}
          <div className="p-2">
            <div className="px-2 pb-1 text-[10px] font-semibold uppercase tracking-wide text-[var(--ks-color-text-soft)]">
              Mudar para
            </div>
            {opcoes.map((o) => {
              const ativo = o.value === status;
              return (
                <button
                  key={o.value}
                  type="button"
                  role="menuitem"
                  onClick={() => escolher(o.value)}
                  className={`flex w-full items-center justify-between rounded-lg px-3 py-2 text-left text-sm transition ${
                    ativo
                      ? "font-semibold text-[var(--ks-color-primary)]"
                      : "text-[var(--ks-color-text-primary)] hover:bg-[var(--ks-color-bg-soft)]"
                  } ${o.value === "canceled" ? "text-[var(--ks-color-status-danger)]" : ""}`}
                >
                  {o.label}
                  {ativo ? <Check size={14} /> : null}
                </button>
              );
            })}
          </div>
        </div>
      ) : null}
    </div>
  );
}
