"use client";

import { createContext, useContext, useMemo } from "react";
import { visaoPadrao, type VisaoDoVisitante } from "@/lib/loja/regras-da-loja";

/*
  A visao do visitante, entregue a qualquer componente da loja.

  As paginas (servidor) calculam `resolverVisao` a cada requisicao e passam o
  resultado ao StoreLayout, que o poe neste contexto. Card, pagina do produto,
  carrinho e checkout leem daqui com `useVisaoDaLoja()`, sem que a visao
  precise atravessar as setenta props do StoreContent.

  Fora de um provider (teste, componente solto), vale a visao padrao: a loja
  como sempre foi, com preco e carrinho. Assim nenhum componente muda de
  comportamento por acidente.
*/

const Contexto = createContext<VisaoDoVisitante | null>(null);

export function VisaoDaLojaProvider({ visao, children }: { visao?: VisaoDoVisitante | null; children: React.ReactNode }) {
  const valor = useMemo(() => visao ?? visaoPadrao(), [visao]);
  return <Contexto.Provider value={valor}>{children}</Contexto.Provider>;
}

export function useVisaoDaLoja(): VisaoDoVisitante {
  const visao = useContext(Contexto);
  return visao ?? PADRAO;
}

const PADRAO = visaoPadrao();
