// js/components/widgets/OrcamentoPipeline.jsx
// Pipeline visual (Kanban) — Onda V5 (sistema 4).
// Funil de orçamentos por status. Cards arrastáveis no futuro (V5.1).
// Criado em 2026-05-06.
// [Wave 38 v224.19 NUCLEAR EXTRACT 2026-05-24] 274L -> ~95L (-65%) · 13ª replicação NUCLEAR
// Padrão NUCLEAR pure-orchestrator UI-state híbrido (Wave 33 ProdutoTimeline + Wave 37 CancelInsights calibrado)
// PRIVACY: scope sellerName preservado (vendedora vê só próprios)
//
// 🎯 ACHIEVEMENT: Trinca Orcamentos COMPLETA (Wave 27 Timeline + Wave 37 CancelInsights + Wave 38 Pipeline)
//
// Props:
//   quotes: array de orçamentos (todos status)
//   clients: pra mostrar nome do cliente
//   user: pra scope (vendedor vê próprios)
//   onSelect: (quoteId) => void — clique no card abre Orçamento 360º
//
// Deps runtime globals: fmtMoney
// Deps Wave 38: ZNX.lib['orcamento-pipeline'].calcs + ZNX.widgets['orcamento-pipeline'].{
//   PipelineHeader, PipelineKPIs, PipelineKanban, PipelineFooter}
(function() {
  'use strict';
  const {useMemo, useState} = React;

  // [Wave 38 v224.19 + v224.54 2026-05-28] vars+check MOVED to component body (ERP-5M false positive)

  function OrcamentoPipeline({ quotes, clients, user, onSelect }) {
    // [v224.54 FIX-5M 2026-05-28] vars+check em render time
    const opW = (window.ZNX && window.ZNX.widgets && window.ZNX.widgets['orcamento-pipeline']) || {};
    const opCalcs = window.ZNX && window.ZNX.lib && window.ZNX.lib['orcamento-pipeline'] && window.ZNX.lib['orcamento-pipeline'].calcs;
    if(!opCalcs || !opW.PipelineHeader || !opW.PipelineKPIs || !opW.PipelineKanban || !opW.PipelineFooter){
      const _msg = '[OrcamentoPipeline v224.19 wave38] deps faltando: calcs='+!!opCalcs+', PipelineHeader='+!!opW.PipelineHeader+', PipelineKPIs='+!!opW.PipelineKPIs+', PipelineKanban='+!!opW.PipelineKanban+', PipelineFooter='+!!opW.PipelineFooter;
      console.error(_msg);
      if(window.Sentry && typeof window.Sentry.captureMessage === 'function') window.Sentry.captureMessage(_msg, 'error');
    }
    // [PRIVACY] Vendedora vê só próprios (filter por sellerName dentro de calcs.buildPipelineData)
    const isVendedor = user?.role === 'vendedor';
    // UI ephemeral state — hover col background (preserved LITERAL)
    const [hoveredCol, setHoveredCol] = useState(null);

    // [Wave 38 v224.19] useMemo data via lib (era inline L44-96 · 53L extraídos)
    const data = useMemo(() => opCalcs.buildPipelineData(quotes, user, isVendedor), [quotes, user, isVendedor]);

    return (
      <div>
        {opW.PipelineHeader && <opW.PipelineHeader isVendedor={isVendedor}/>}
        {opW.PipelineKPIs && <opW.PipelineKPIs data={data}/>}
        {opW.PipelineKanban && <opW.PipelineKanban
          data={data}
          clients={clients}
          isVendedor={isVendedor}
          onSelect={onSelect}
          hoveredCol={hoveredCol}
          setHoveredCol={setHoveredCol}
        />}
        {opW.PipelineFooter && <opW.PipelineFooter/>}
      </div>
    );
  }

  // Namespace
  window.ZNX = window.ZNX || {};
  window.ZNX.components = window.ZNX.components || {};
  window.ZNX.components.OrcamentoPipeline = OrcamentoPipeline;
  window.OrcamentoPipeline = OrcamentoPipeline;

  // Marca onda V5
  window.ZNX.refactor_phase_5_loaded = window.ZNX.refactor_phase_5_loaded || {};
  window.ZNX.refactor_phase_5_loaded.OrcamentoPipeline = true;
  // [Wave 38 marker v224.19] confirma extract executado
  window.OrcamentoPipeline_v224_19_wave38 = true;
})();
