// js/components/pages/ProdutoTimeline.jsx
// Produto 360º — visão unificada de 1 produto: Health Score + Top Clientes +
// Sazonalidade + Cross-sell + Sugestão de Reposição + Timeline de saídas.
// Criado em 2026-05-05 (sistema 4 onda P4). Espelho arquitetural do ClienteTimeline.jsx.
// [Wave 33 v224.14 NUCLEAR EXTRACT 2026-05-24] 273L -> ~115L (-58%) · 8ª replicação NUCLEAR
// Extract: 1 lib (buildTimelineEvents) + 4 widgets · espelho Wave 28 ClienteTimeline (-54.2%)
//
// Props:
//   product, products, sales, clients, user, onBack
//
// Deps runtime globals: fmt, fmtDate, computeProductHealth, topClientsForProduct,
//   seasonalityForProduct, crossSellForProduct, reorderSuggestion (productHealth.js Wave 11)
// Deps Wave 33 widgets: ZNX.widgets['produto-timeline'].{ProductHeader, ProductHealthCard,
//   ProductInsightsGrid, ProductTimelineTable} + ZNX.lib['produto-timeline'].calcs
(function() {
  'use strict';
  const {useState, useMemo} = React;

  // [Wave 33 v224.14 + v224.55 2026-05-28] vars+check MOVED to component body (preventivo)
  // regra_validacao_helpers_runtime_quando_ordem_scripts_uncertain

function ProdutoTimeline({product, products, sales, clients, user, onBack}){
  // [v224.55 FIX-PREV-8 2026-05-28] vars+check em render time
  const ptW = (window.ZNX && window.ZNX.widgets && window.ZNX.widgets['produto-timeline']) || {};
  const ptCalcs = window.ZNX && window.ZNX.lib && window.ZNX.lib['produto-timeline'] && window.ZNX.lib['produto-timeline'].calcs;
  if(!ptCalcs || !ptW.ProductHeader || !ptW.ProductHealthCard || !ptW.ProductInsightsGrid || !ptW.ProductTimelineTable){
    const _msg = '[ProdutoTimeline v224.14 wave33] deps faltando: calcs='+!!ptCalcs+', ProductHeader='+!!ptW.ProductHeader+', ProductHealthCard='+!!ptW.ProductHealthCard+', ProductInsightsGrid='+!!ptW.ProductInsightsGrid+', ProductTimelineTable='+!!ptW.ProductTimelineTable;
    console.error(_msg);
    if(window.Sentry && typeof window.Sentry.captureMessage === 'function') window.Sentry.captureMessage(_msg, 'error');
  }
  if(!product){
    return(
      <div style={{padding:40,textAlign:'center',color:'#6B7280'}}>
        Nenhum produto selecionado. Volte pra Lista e clique em um produto.
      </div>
    );
  }

  // ========= DADOS DERIVADOS — pattern typeof X==='function' PRESERVADO LITERAL =========
  const health = useMemo(()=>typeof computeProductHealth==='function'?computeProductHealth(product,sales):null,[product,sales]);
  const topClients = useMemo(()=>typeof topClientsForProduct==='function'?topClientsForProduct(product.id,sales,clients):[],[product.id,sales,clients]);
  const seasonality = useMemo(()=>typeof seasonalityForProduct==='function'?seasonalityForProduct(product.id,sales):[],[product.id,sales]);
  const crossSell = useMemo(()=>typeof crossSellForProduct==='function'?crossSellForProduct(product.id,sales,products):[],[product.id,sales,products]);
  const reorder = useMemo(()=>typeof reorderSuggestion==='function'?reorderSuggestion(product,sales):null,[product,sales]);

  // [Wave 33 v224.14] Timeline events via lib/produto-timeline/calcs (era useMemo inline L31-52)
  const timeline = useMemo(()=>ptCalcs?ptCalcs.buildTimelineEvents(product, sales, clients):[], [product, sales, clients]);

  // KPIs gerais (LITERAL L54-58 · preserva ticketMedioUnidades mesmo unused)
  const totalUnidades = timeline.reduce((s,e)=>s+e.qty,0);
  const totalReceita = timeline.reduce((s,e)=>s+e.revenue,0);
  const totalVendas = new Set(timeline.map(e=>e.saleNumber)).size;
  const ticketMedioUnidades = totalVendas>0?totalUnidades/totalVendas:0;

  // Cor da margem (LITERAL L61)
  const marginColor = health?.margin>=25?'#16A34A':health?.margin>=15?'#2563EB':health?.margin>=8?'#EA580C':'#DC2626';

  // Max sazonalidade pra normalizar barras (LITERAL L64)
  const maxSeas = Math.max(1, ...seasonality.map(m=>m.qty));

  // === Render (4 widgets extracted · ordem preservada: header → health → insights → timeline) ===
  return(
    <div>
      {ptW.ProductHeader && <ptW.ProductHeader product={product} health={health} reorder={reorder} onBack={onBack}/>}
      {ptW.ProductHealthCard && <ptW.ProductHealthCard health={health} product={product} marginColor={marginColor} totalReceita={totalReceita} totalVendas={totalVendas} totalUnidades={totalUnidades}/>}
      {ptW.ProductInsightsGrid && <ptW.ProductInsightsGrid topClients={topClients} seasonality={seasonality} crossSell={crossSell} maxSeas={maxSeas} totalUnidades={totalUnidades} totalReceita={totalReceita}/>}
      {ptW.ProductTimelineTable && <ptW.ProductTimelineTable events={timeline}/>}
    </div>
  );
}

  // Namespace
  window.ZNX = window.ZNX || {};
  window.ZNX.pages = window.ZNX.pages || {};
  window.ZNX.pages.ProdutoTimeline = ProdutoTimeline;
  window.ProdutoTimeline = ProdutoTimeline;
  // [Wave 33 marker v224.14] confirma extract executado
  window.ProdutoTimeline_v224_14_wave33 = true;
})();
