// js/components/pages/Freteiros.jsx
// FRT-C1 (2026-05-09) — Lista de freteiros + ficha 360° (Notas + Extrato + Score).
// Roles: admin, freight_manager.
// [Wave 31 v224.12 NUCLEAR 2026-05-24] 623L -> ~285L (-54%) · 6ª replicação padrão NUCLEAR
// Extract: lib expansion + 5 widgets (SharedComponents + StatsRow + CarriersTable + CarrierCrudModal + Ficha360Modal)
// Deps runtime: sb (window.sb), toast, Modal, Icon, fmt, fmtDate (globals)
(function() {
  'use strict';
  const {useState, useEffect, useMemo, useCallback} = React;

  // [Wave 31 v224.12] ESTENDIDO bloco refs+fail-loud 1 → 6 refs (regra_estender_bloco_refs_fail_loud)
  // [Wave 31 v224.12 + v224.55 2026-05-28] vars+check MOVED to component body (preventivo)
  // regra_validacao_helpers_runtime_quando_ordem_scripts_uncertain

  // [Wave 31 v224.12] 4 helpers locais (fmtUSD + fmtPct + fmtShortDate + noteStatusBadge) DELETADOS
  // — agora em ZNX.freteiros.calcs (lib expansion) + ZNX.widgets.freteiros.SharedComponents.NoteStatusBadge

  // ══════════════════════════════════════════════════════════════
  // COMPONENTE PRINCIPAL
  // ══════════════════════════════════════════════════════════════

  function Freteiros({ user }) {
    // [v224.55 FIX-PREV-4 2026-05-28] vars+check em render time
    const freteirosCalcs = window.ZNX && window.ZNX.freteiros && window.ZNX.freteiros.calcs;
    const SC = window.ZNX && window.ZNX.widgets && window.ZNX.widgets.freteiros && window.ZNX.widgets.freteiros.SharedComponents;
    const StatsRow = window.ZNX && window.ZNX.widgets && window.ZNX.widgets.freteiros && window.ZNX.widgets.freteiros.StatsRow;
    const CarriersTable = window.ZNX && window.ZNX.widgets && window.ZNX.widgets.freteiros && window.ZNX.widgets.freteiros.CarriersTable;
    const CarrierCrudModal = window.ZNX && window.ZNX.widgets && window.ZNX.widgets.freteiros && window.ZNX.widgets.freteiros.CarrierCrudModal;
    const Ficha360Modal = window.ZNX && window.ZNX.widgets && window.ZNX.widgets.freteiros && window.ZNX.widgets.freteiros.Ficha360Modal;
    if (!freteirosCalcs || !SC || !StatsRow || !CarriersTable || !CarrierCrudModal || !Ficha360Modal) {
      const _msg = '[Freteiros v224.12 wave31] widgets faltando: calcs='+!!freteirosCalcs+', SC='+!!SC+', StatsRow='+!!StatsRow+', CarriersTable='+!!CarriersTable+', CarrierCrudModal='+!!CarrierCrudModal+', Ficha360Modal='+!!Ficha360Modal;
      console.error(_msg);
      if(window.Sentry && typeof window.Sentry.captureMessage === 'function'){
        window.Sentry.captureMessage(_msg, 'error');
      }
    }
    // === Hooks (TODOS antes de qualquer early return — regra_early_return_e_hooks) ===
    const [carriers, setCarriers] = useState([]);
    const [transactions, setTransactions] = useState([]);
    const [notes, setNotes] = useState([]);
    const [items, setItems] = useState([]);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    const [modalCRUD, setModalCRUD] = useState(null); // 'new' | 'edit' | null
    const [editCarrierId, setEditCarrierId] = useState(null); // regra_state_id_vs_objeto
    const [crudForm, setCrudForm] = useState({
      name: '', document: '', phone: '',
      guarantee_usd: 0, commission_pct: 30,
      notes: '', active: true,
    });
    const [crudSaving, setCrudSaving] = useState(false);

    const [selectedCarrierId, setSelectedCarrierId] = useState(null); // ficha 360
    const [activeTab, setActiveTab] = useState('notes'); // notes|extrato|score
    const [searchQ, setSearchQ] = useState('');
    // FRT-C4 (2026-05-09) — Modal de saque (admin only). Lookup carrier via id (regra_state_id_vs_objeto)
    const [saqueCarrierId, setSaqueCarrierId] = useState(null);

    const isAdmin = user?.role === 'admin';
    const canEdit = user?.role === 'admin' || user?.role === 'freight_manager';
    const canCreate = canEdit;

    // === Loaders ===
    const loadAll = useCallback(async () => {
      if (typeof sb === 'undefined' || !sb.from) return;
      setLoading(true);
      setError(null);
      try {
        // Paralelos pra perf
        const [c, t, n, i] = await Promise.all([
          sb.from('freight_carriers').select('*').is('deleted_at', null).order('created_at', { ascending: false }),
          sb.from('freight_carrier_transactions').select('*').is('deleted_at', null).order('created_at', { ascending: false }).limit(2000),
          sb.from('freight_notes').select('*').is('deleted_at', null).order('emitted_at', { ascending: false }).limit(2000),
          sb.from('freight_note_items').select('id,note_id,product_id,expected_qty,received_qty,unit_cost_usd').limit(5000),
        ]);
        if (c.error) throw c.error;
        if (t.error) throw t.error;
        if (n.error) throw n.error;
        if (i.error) throw i.error;
        setCarriers(c.data || []);
        setTransactions(t.data || []);
        setNotes(n.data || []);
        setItems(i.data || []);
      } catch (e) {
        console.error('[Freteiros] load error:', e);
        setError(e?.message || String(e));
        if (typeof Sentry !== 'undefined') Sentry.captureException(e, { extra: { context: 'Freteiros.loadAll' } });
      } finally {
        setLoading(false);
      }
    }, []);

    useEffect(() => {
      // [v224.72] cancelled flag preventivo · full fix = passar cancelled pra loadAll (deferred)
      let cancelled = false;
      loadAll();
      return () => { cancelled = true; };
    }, [loadAll]);

    // === Derivados (useMemo lookups + agregações) ===
    // [Wave 11 MINI 2026-05-17] 7 useMemos extraídos pra lib/freteiros/calcs.js (factory puras)
    const filteredCarriers = useMemo(() => freteirosCalcs.computeFilteredCarriers(carriers, searchQ), [carriers, searchQ]);
    const carrierScores = useMemo(() => freteirosCalcs.computeCarrierScores(carriers, notes, items), [carriers, notes, items]);
    const stats = useMemo(() => freteirosCalcs.computeStats(carriers, carrierScores), [carriers, carrierScores]);
    // CRIT-7 pattern preservado: selectedCarrier derived from selectedCarrierId (regra_state_id_vs_objeto)
    const selectedCarrier = useMemo(() => freteirosCalcs.computeSelectedCarrier(carriers, selectedCarrierId), [selectedCarrierId, carriers]);
    const selectedCarrierNotes = useMemo(() => freteirosCalcs.computeSelectedCarrierNotes(notes, selectedCarrier), [selectedCarrier, notes]);
    const selectedCarrierTxns = useMemo(() => freteirosCalcs.computeSelectedCarrierTxns(transactions, selectedCarrier), [selectedCarrier, transactions]);
    const selectedCarrierScore = useMemo(() => freteirosCalcs.computeSelectedCarrierScore(carrierScores, selectedCarrier), [selectedCarrier, carrierScores]);

    // === Handlers ===
    function openNewModal() {
      setEditCarrierId(null);
      setCrudForm({
        name: '', document: '', phone: '',
        guarantee_usd: 0, commission_pct: 30,
        notes: '', active: true,
      });
      setModalCRUD('new');
    }
    function openEditModal(carrier) {
      setEditCarrierId(carrier.id);
      setCrudForm({
        name: carrier.name || '',
        document: carrier.document || '',
        phone: carrier.phone || '',
        guarantee_usd: Number(carrier.guarantee_usd) || 0,
        commission_pct: Number(carrier.commission_pct) || 0,
        notes: carrier.notes || '',
        active: carrier.active !== false,
      });
      setModalCRUD('edit');
    }
    function closeModal() {
      setModalCRUD(null);
      setEditCarrierId(null);
    }

    async function handleSubmitCrud() {
      if (!canEdit) { toast('⛔ Sem permissão.', 'error'); return; }
      if (crudSaving) return;
      const name = (crudForm.name || '').trim();
      if (!name) { toast('Nome do freteiro é obrigatório.', 'error'); return; }
      const guarantee = Number(crudForm.guarantee_usd) || 0;
      const pct = Number(crudForm.commission_pct) || 0;
      if (guarantee < 0) { toast('Garantia não pode ser negativa.', 'error'); return; }
      if (pct < 0 || pct > 100) { toast('Comissão % deve estar entre 0 e 100.', 'error'); return; }

      setCrudSaving(true);
      try {
        const idem = (window.crypto?.randomUUID?.() || (Date.now() + '-' + Math.random()));
        if (modalCRUD === 'new') {
          const { data, error } = await sb.rpc('create_freight_carrier_v1', {
            payload: {
              idempotency_key: idem,
              name, document: crudForm.document || null, phone: crudForm.phone || null,
              guarantee_usd: guarantee, commission_pct: pct,
              notes: crudForm.notes || null,
            },
          });
          if (error) throw error;
          if (!data?.success) throw new Error(data?.error_message || 'Falha ao criar freteiro');
          toast('✅ Freteiro cadastrado!');
        } else if (modalCRUD === 'edit') {
          if (!editCarrierId) { toast('ID inválido.', 'error'); return; }
          const { data, error } = await sb.rpc('update_freight_carrier_v1', {
            payload: {
              carrier_id: editCarrierId,
              name, document: crudForm.document, phone: crudForm.phone,
              commission_pct: pct, active: crudForm.active,
              notes: crudForm.notes,
            },
          });
          if (error) throw error;
          if (!data?.success) throw new Error(data?.error_message || 'Falha ao editar');
          toast('✅ Freteiro atualizado!');
        }
        closeModal();
        await loadAll();
      } catch (e) {
        console.error('[Freteiros] save error:', e);
        toast('❌ ' + (e?.message || 'Erro inesperado'), 'error');
        if (typeof Sentry !== 'undefined') Sentry.captureException(e, { extra: { context: 'Freteiros.handleSubmitCrud', modalCRUD } });
      } finally {
        setCrudSaving(false);
      }
    }

    // === Privacy / role guard ===
    if (!canEdit && user?.role !== 'admin' && user?.role !== 'freight_manager' && user?.role !== 'financeiro') {
      return (
        <div style={{ padding: 40, textAlign: 'center' }}>
          <div style={{ fontSize: 48, marginBottom: 10 }}>🔒</div>
          <div style={{ fontSize: 18, fontWeight: 700, color: '#B91C1C' }}>Acesso restrito</div>
          <div style={{ fontSize: 13, color: '#6B7280', marginTop: 6 }}>
            Apenas admin, freight_manager e financeiro podem ver freteiros.
          </div>
        </div>
      );
    }

    // === Render (extracted: 4 widgets + Ficha360Modal · sub-components em SharedComponents) ===
    return (
      <div className="page-content" style={{ padding: 24 }}>
        {/* Header */}
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 18, flexWrap: 'wrap', gap: 12 }}>
          <div>
            <div style={{ fontSize: 22, fontWeight: 800, color: '#1B2A4A', display: 'flex', alignItems: 'center', gap: 8 }}>
              🚚 Freteiros
            </div>
            <div style={{ fontSize: 12, color: '#6B7280', marginTop: 2 }}>
              Gestão de freteiros PY→BR · saldo USD · score
            </div>
          </div>
          {canCreate && (
            <button className="btn-gold" onClick={openNewModal} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
              <Icon n="plus" size={14} /> Novo Freteiro
            </button>
          )}
        </div>

        {/* Stats row (4 StatCards extraídos pra StatsRow widget) */}
        {StatsRow && <StatsRow stats={stats} />}

        {/* Search + Loading/Error/Empty + Tabela carriers (extraídos pra CarriersTable widget) */}
        {CarriersTable && (
          <CarriersTable
            filteredCarriers={filteredCarriers} carrierScores={carrierScores}
            searchQ={searchQ} setSearchQ={setSearchQ}
            loading={loading} error={error}
            onSelectCarrier={(id) => { setSelectedCarrierId(id); setActiveTab('notes'); }}
            onEditCarrier={openEditModal}
            onSaqueCarrier={(id) => setSaqueCarrierId(id)}
            canEdit={canEdit} isAdmin={isAdmin}
          />
        )}

        {/* MODAL CRUD (extraído pra CarrierCrudModal widget) */}
        {CarrierCrudModal && (
          <CarrierCrudModal
            modalCRUD={modalCRUD} crudForm={crudForm} setCrudForm={setCrudForm}
            crudSaving={crudSaving}
            onSubmit={handleSubmitCrud}
            onClose={closeModal}
          />
        )}

        {/* FRT-C4 (2026-05-09) — Modal de Saque (admin only) — preservado LITERAL (fora do escopo Wave 31) */}
        {saqueCarrierId && isAdmin && (
          <SaqueFreteiroModal
            carrier={carriers.find(c => c.id === saqueCarrierId)}
            user={user}
            onClose={() => setSaqueCarrierId(null)}
            onSuccess={async () => { await loadAll(); }}
          />
        )}

        {/* FICHA 360° (extraída pra Ficha360Modal widget · 3 tabs Notas+Extrato+Score) */}
        {Ficha360Modal && (
          <Ficha360Modal
            selectedCarrier={selectedCarrier}
            selectedCarrierNotes={selectedCarrierNotes}
            selectedCarrierTxns={selectedCarrierTxns}
            selectedCarrierScore={selectedCarrierScore}
            activeTab={activeTab} setActiveTab={setActiveTab}
            onClose={() => setSelectedCarrierId(null)}
          />
        )}
      </div>
    );
  }

  // [Wave 31 v224.12] 4 sub-components LOCAIS (StatCard + FichaStat + Th + Field)
  // DELETADOS — agora em ZNX.widgets.freteiros.SharedComponents

  // ══════════════════════════════════════════════════════════════
  // EXPORT (Babel runtime pattern)
  // ══════════════════════════════════════════════════════════════
  window.ZNX = window.ZNX || {};
  window.ZNX.components = window.ZNX.components || {};
  window.ZNX.components.Freteiros = Freteiros;
  window.Freteiros = Freteiros;

  window.ZNX.refactor_phase_6_loaded = window.ZNX.refactor_phase_6_loaded || {};
  window.ZNX.refactor_phase_6_loaded.Freteiros = true;
  // [Wave 31 marker v224.12] confirma extract executado
  window.Freteiros_v224_12_wave31 = true;
})();
