"use client";

import { useEffect, useMemo, useState } from "react";
import type { EstoqueDaEscolha } from "@/lib/estoque-v2-da-loja";

/*
  Estoque v2 na página do produto: a cada escolha (tamanho, cor, quantidade,
  medidas) a loja pergunta ao servidor quanto dá para vender DAQUELA
  combinação (/api/catalog/estoque → estoque_disponivel no banco, a mesma
  conta do PDV e do orçamento). Só pergunta quando o produto veio marcado
  como estoque v2 pelo servidor; nos outros a página segue com o saldo que já
  veio com o produto, exatamente como sempre.

  A pergunta é sempre por 1 unidade: a resposta traz o máximo que cabe
  (`disponivel`, já em peças para a medida escolhida) e a página compara a
  quantidade com ele sem ir ao servidor a cada "+".

  Enquanto a resposta não chega vale a anterior (ou a da vitrine): nada pisca.
*/

export function useEstoqueDaEscolha(params: {
  ativo: boolean;
  slug: string;
  productId: string;
  selected: unknown;
  largura?: number | null;
  altura?: number | null;
  completa: boolean;
}): EstoqueDaEscolha | null {
  const { ativo, slug, productId, selected, largura, altura, completa } = params;
  const chave = useMemo(
    () =>
      ativo
        ? JSON.stringify({ slug, productId, selected: selected ?? null, largura: largura || null, altura: altura || null, completa })
        : "",
    [ativo, slug, productId, selected, largura, altura, completa]
  );
  const [resposta, setResposta] = useState<{ chave: string; estoque: EstoqueDaEscolha | null } | null>(null);

  useEffect(() => {
    if (!chave) return;
    const controle = new AbortController();
    const espera = window.setTimeout(async () => {
      try {
        const corpo = JSON.parse(chave) as Record<string, unknown>;
        const r = await fetch("/api/catalog/estoque", {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          signal: controle.signal,
          body: JSON.stringify({
            slug: corpo.slug,
            produto: {
              product_id: corpo.productId,
              selected_options: corpo.selected,
              quantity: 1,
              width_m: corpo.largura,
              height_m: corpo.altura,
              completa: corpo.completa,
            },
          }),
        });
        if (!r.ok) return;
        const json = (await r.json()) as (EstoqueDaEscolha & { falhou?: boolean }) | { v2: false };
        if (!json || json.v2 !== true || ("falhou" in json && json.falhou)) {
          setResposta({ chave, estoque: null });
          return;
        }
        setResposta({ chave, estoque: json as EstoqueDaEscolha });
      } catch {
        /* abortada ou sem rede: fica a resposta anterior */
      }
    }, 220);
    return () => {
      controle.abort();
      window.clearTimeout(espera);
    };
  }, [chave]);

  if (!ativo) return null;
  return resposta?.estoque ?? null;
}
