// js/components/pages/OrcamentoTimeline.jsx
// [Wave 27 v224.8 NUCLEAR EXTRACT 2026-05-24] 394L → ~155L (-61%)
// Padrão Wave 15 VendaTimeline cravado. 4 extracts (1 lib + 3 widgets).
//
// Orçamento 360º — visão unificada de 1 orçamento: KPIs + avisos + ações + timeline.
// Criado em 2026-05-06 (sistema 4 onda V3) · NUCLEAR refactor 2026-05-24.
//
// Props:
//   quote, client, products, discountRequests, sales, user,
//   onBack, onEdit, onCancel, onConvert, onPrintPdf, onWhatsApp
//
// Deps runtime: fmt, fmtDateTime, saleFinalTotal, itemNet, sb
(function() {
  'use strict';
  const {useState, useEffect, useMemo} = React;

  // regra_estender_bloco_refs_fail_loud — bloco agregado (4 refs novos · greenfield)
  // [v224.55 FIX-PREV-6 2026-05-28] vars+check MOVED to component body (preventivo)
  // regra_validacao_helpers_runtime_quando_ordem_scripts_uncertain

  function OrcamentoTimeline({quote, client, products, discountRequests, sales, user, onBack, onEdit, onCancel, onConvert, onPrintPdf, onWhatsApp}){
    // [v224.55 FIX-PREV-6 2026-05-28] vars+check em render time
    const calcs = window.ZNX && window.ZNX.orcamentoTimeline && window.ZNX.orcamentoTimeline.calcs;
    const otW = (window.ZNX && window.ZNX.widgets && window.ZNX.widgets.orcamentoTimeline) || {};
    const _missing = [];
    if(!calcs) _missing.push('orcamentoTimeline.calcs');
    if(!otW.TimelineHeader) _missing.push('TimelineHeader');
    if(!otW.AvisosPanel) _missing.push('AvisosPanel');
    if(!otW.TimelineList) _missing.push('TimelineList');
    if(_missing.length){
      const _msg = '[OrcamentoTimeline v224.8] widgets faltando: ' + _missing.join(', ');
      console.error(_msg);
      if(window.Sentry && typeof window.Sentry.captureMessage === 'function'){
        window.Sentry.captureMessage(_msg, 'error');
      }
    }
    if(!quote){
      return (
        <div style={{padding:40,textAlign:'center',color:'#6B7280'}}>
          Nenhum orçamento selecionado. Volte pra Lista e clique no 🎯 de um orçamento.
        </div>
      );
    }

    // ===== AUDIT TIMELINE (async via factory) =====
    const [auditEvents, setAuditEvents] = useState([]);
    useEffect(function(){
      if(!quote || !quote.id) return;
      let cancelled = false;
      calcs.fetchAuditEvents(quote.id).then(function(data){
        if(!cancelled) setAuditEvents(data);
      });
      return function(){cancelled = true;};
    }, [quote && quote.id]);

    // ===== HOOKS WRAPPERS via calcs factories (ZERO mudança lógica) =====
    const kpis = useMemo(function(){return calcs.computeKpis(quote, products);}, [quote, products]);
    const dr = useMemo(function(){return calcs.findDiscountRequest(discountRequests, quote.id);}, [discountRequests, quote.id]);
    const saleConvertida = useMemo(function(){return calcs.findSaleConvertida(sales, quote);}, [sales, quote]);
    const avisos = useMemo(function(){return calcs.computeAvisos(quote, kpis, dr, user && user.role);}, [quote, kpis, dr, user && user.role]);
    const timeline = useMemo(function(){return calcs.computeTimeline(quote, dr, saleConvertida, auditEvents);}, [auditEvents, dr, saleConvertida, quote]);

    // ===== UI vars (status/colors/permissions) (literal L222-239) =====
    const status = quote.status || 'Aberto';
    const statusColor = status === 'Convertido' ? '#16A34A'
      : (status === 'Cancelado' || status === 'Cancelada' || status === 'Recusado') ? '#DC2626'
      : status === 'Aguardando_pagamento' ? '#2563EB'
      : status === 'Aprovado' ? '#16A34A'
      : '#EA580C';
    const TERMINAL = ['Convertido','Cancelado','Cancelada','Recusado','recusado'];
    const isTerminal = TERMINAL.includes(status);
    const isAdmin = user && user.role === 'admin';
    const isFinanceiro = user && user.role === 'financeiro';
    const isReadOnly = isFinanceiro;
    const canConvert = (isAdmin || isFinanceiro) && !isTerminal;
    const canEdit = !isReadOnly && !isTerminal;
    const canCancel = !isReadOnly && !isTerminal;

    return (
      <div>
        {/* Header + KPIs (extraído pra TimelineHeader) */}
        {otW.TimelineHeader && (
          <otW.TimelineHeader
            quote={quote}
            client={client}
            kpis={kpis}
            saleConvertida={saleConvertida}
            statusColor={statusColor}
            userRole={user && user.role}
            onBack={onBack}
          />
        )}

        {/* Avisos + Ações rápidas (extraído pra AvisosPanel) */}
        {otW.AvisosPanel && (
          <otW.AvisosPanel
            avisos={avisos}
            quote={quote}
            canConvert={canConvert}
            canEdit={canEdit}
            canCancel={canCancel}
            onEdit={onEdit}
            onCancel={onCancel}
            onConvert={onConvert}
            onPrintPdf={onPrintPdf}
            onWhatsApp={onWhatsApp}
          />
        )}

        {/* 2-col grid: Items + Timeline (extraído pra TimelineList) */}
        {otW.TimelineList && (
          <otW.TimelineList
            quote={quote}
            products={products}
            timeline={timeline}
          />
        )}
      </div>
    );
  }

  // Namespace
  window.ZNX = window.ZNX || {};
  window.ZNX.pages = window.ZNX.pages || {};
  window.ZNX.pages.OrcamentoTimeline = OrcamentoTimeline;
  window.OrcamentoTimeline = OrcamentoTimeline;
  // [Wave 27 marker v224.8] confirma extract executado
  window.OrcamentoTimeline_v224_8_wave27 = true;
})();
