// js/components/pages/AprovacoesFrete.jsx
// FRT-C4 (2026-05-09) — Aprovações de close_requests pelo admin.
// Preview do cálculo de comissão ANTES de aprovar (fórmula MISTO transparente).
// Roles: admin (aprovar/negar), financeiro (read-only).
// Pattern espelhado de discount_requests/cancel_requests existentes.
// Deps runtime: sb, toast, Modal, Icon (globals)
(function() {
  'use strict';
  const {useState, useEffect, useMemo, useCallback} = React;

  // ══════════════════════════════════════════════════════════════
  // HELPERS — [Wave 13 v223.38] extraídos pra js/lib/freight-helpers.js + widgets/freight-badges.jsx
  // ══════════════════════════════════════════════════════════════
  // fmtUSD, fmtPct, fmtShortDate, genIdem, previewCommission → window.ZNX.lib.freight
  // typeBadge → <FreightTypeBadge type=.../> (window.FreightTypeBadge)
  // statusBadge → <FreightStatusBadge status=.../> (window.FreightStatusBadge)
  const _freightLib = (window.ZNX && window.ZNX.lib && window.ZNX.lib.freight) || {};
  const fmtUSD = _freightLib.fmtUSD;
  const fmtPct = _freightLib.fmtPct;
  const fmtShortDate = _freightLib.fmtShortDate;
  const genIdem = _freightLib.genIdem;
  const previewCommission = _freightLib.previewCommission;
  if (typeof fmtUSD !== 'function' || typeof previewCommission !== 'function') {
    console.error('[ZNX v223.38] js/lib/freight-helpers.js não carregou — AprovacoesFrete broken');
  }

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

  function AprovacoesFrete({ user }) {
    // === Hooks ===
    const [requests, setRequests] = useState([]);
    const [notes, setNotes] = useState([]);
    const [items, setItems] = useState([]);
    const [carriers, setCarriers] = useState([]);
    const [products, setProducts] = useState([]);
    const [appUsers, setAppUsers] = useState([]);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    const [filterStatus, setFilterStatus] = useState('pending');
    const [filterType, setFilterType] = useState('all');

    const [modalApproveId, setModalApproveId] = useState(null);
    const [modalDenyId, setModalDenyId] = useState(null);
    const [adminNotes, setAdminNotes] = useState('');
    const [denyReason, setDenyReason] = useState('');
    const [inFlight, setInFlight] = useState(false);

    const isAdmin = user?.role === 'admin';
    const canView = isAdmin || user?.role === 'financeiro' || user?.role === 'freight_manager';
    const canApprove = isAdmin;

    // === Loaders ===
    const loadAll = useCallback(async () => {
      if (typeof sb === 'undefined' || !sb.from) return;
      setLoading(true);
      setError(null);
      try {
        const [r, n, i, c, p, u] = await Promise.all([
          sb.from('freight_close_requests').select('*').is('deleted_at', null).order('created_at', { ascending: false }).limit(500),
          sb.from('freight_notes').select('id,number,carrier_id,status,exchange_rate_usd_brl').is('deleted_at', null).limit(2000),
          sb.from('freight_note_items').select('id,note_id,product_id,expected_qty,received_qty,unit_cost_usd').limit(5000),
          sb.from('freight_carriers').select('id,name,guarantee_usd,current_balance_usd,commission_pct').is('deleted_at', null),
          sb.from('products').select('id,name,brand,volume').is('deleted_at', null).eq('active', true).limit(2000),
          sb.from('app_users').select('id,name').limit(500),
        ]);
        if (r.error) throw r.error;
        if (n.error) throw n.error;
        if (i.error) throw i.error;
        if (c.error) throw c.error;
        if (p.error) throw p.error;
        if (u.error) throw u.error;
        setRequests(r.data || []);
        setNotes(n.data || []);
        setItems(i.data || []);
        setCarriers(c.data || []);
        setProducts(p.data || []);
        setAppUsers(u.data || []);
      } catch (e) {
        console.error('[AprovacoesFrete] load error:', e);
        setError(e?.message || String(e));
        if (typeof Sentry !== 'undefined') Sentry.captureException(e, { extra: { context: 'AprovacoesFrete.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]);

    // === Lookups ===
    const noteMap = useMemo(() => Object.fromEntries(notes.map(n => [n.id, n])), [notes]);
    const carrierMap = useMemo(() => Object.fromEntries(carriers.map(c => [c.id, c])), [carriers]);
    const productMap = useMemo(() => Object.fromEntries(products.map(p => [p.id, p])), [products]);
    const userMap = useMemo(() => Object.fromEntries(appUsers.map(u => [u.id, u])), [appUsers]);

    // === Filter ===
    const filteredRequests = useMemo(() => {
      let list = requests;
      if (filterStatus !== 'all') list = list.filter(r => r.status === filterStatus);
      if (filterType !== 'all') list = list.filter(r => r.type === filterType);
      return list;
    }, [requests, filterStatus, filterType]);

    const stats = useMemo(() => {
      const pending = requests.filter(r => r.status === 'pending').length;
      const approved = requests.filter(r => r.status === 'approved').length;
      const denied = requests.filter(r => r.status === 'denied').length;
      return { pending, approved, denied };
    }, [requests]);

    // Lookup do request selecionado
    const selectedRequest = useMemo(
      () => modalApproveId ? requests.find(r => r.id === modalApproveId) : (modalDenyId ? requests.find(r => r.id === modalDenyId) : null),
      [modalApproveId, modalDenyId, requests]
    );
    const selectedNote = useMemo(
      () => selectedRequest ? noteMap[selectedRequest.note_id] : null,
      [selectedRequest, noteMap]
    );
    const selectedNoteItems = useMemo(
      () => selectedNote ? items.filter(i => i.note_id === selectedNote.id) : [],
      [selectedNote, items]
    );
    const selectedCarrier = useMemo(
      () => selectedNote ? carrierMap[selectedNote.carrier_id] : null,
      [selectedNote, carrierMap]
    );

    const previewData = useMemo(() => {
      if (!selectedRequest || !selectedCarrier || selectedRequest.type !== 'close_with_loss') return null;
      const valor = selectedNoteItems.reduce((s, i) => s + Number(i.expected_qty || 0) * Number(i.unit_cost_usd || 0), 0);
      return previewCommission({
        valor_transportado_usd: valor,
        loss_value_usd: selectedRequest.loss_value_usd,
        carrier: selectedCarrier,
      });
    }, [selectedRequest, selectedCarrier, selectedNoteItems]);

    // === Handlers ===
    function openApprove(req) {
      setModalApproveId(req.id);
      setModalDenyId(null);
      setAdminNotes('');
    }
    function openDeny(req) {
      setModalDenyId(req.id);
      setModalApproveId(null);
      setDenyReason('');
    }
    function closeModals() {
      setModalApproveId(null);
      setModalDenyId(null);
      setAdminNotes('');
      setDenyReason('');
    }

    async function handleApprove() {
      if (!selectedRequest || inFlight || !canApprove) return;
      setInFlight(true);
      try {
        const idem = genIdem();
        const { data, error } = await sb.rpc('approve_close_request_v1', {
          p_request_id: selectedRequest.id,
          p_idempotency_key: idem,
          p_admin_notes: adminNotes || null,
        });
        if (error) throw error;
        if (!data?.success) throw new Error(data?.error_message || 'Falha');
        toast(`✅ Aprovado · ${data.commission_usd != null ? 'comissão ' + fmtUSD(data.commission_usd) : ''}`);
        closeModals();
        await loadAll();
      } catch (e) {
        console.error('[AprovacoesFrete] approve error:', e);
        toast('❌ ' + (e?.message || 'Erro inesperado'), 'error');
        if (typeof Sentry !== 'undefined') Sentry.captureException(e, { extra: { context: 'AprovacoesFrete.handleApprove' } });
      } finally {
        setInFlight(false);
      }
    }

    async function handleDeny() {
      if (!selectedRequest || inFlight || !canApprove) return;
      const reason = (denyReason || '').trim();
      if (!reason) { toast('Razão é obrigatória pra negar', 'error'); return; }
      setInFlight(true);
      try {
        const idem = genIdem();
        const { data, error } = await sb.rpc('deny_close_request_v1', {
          p_request_id: selectedRequest.id,
          p_reason: reason,
          p_idempotency_key: idem,
        });
        if (error) throw error;
        if (!data?.success) throw new Error(data?.error_message || 'Falha');
        toast('✅ Negado');
        closeModals();
        await loadAll();
      } catch (e) {
        console.error('[AprovacoesFrete] deny error:', e);
        toast('❌ ' + (e?.message || 'Erro inesperado'), 'error');
        if (typeof Sentry !== 'undefined') Sentry.captureException(e, { extra: { context: 'AprovacoesFrete.handleDeny' } });
      } finally {
        setInFlight(false);
      }
    }

    // === Privacy guard ===
    if (!canView) {
      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, financeiro e freight_manager podem ver aprovações de frete.
          </div>
        </div>
      );
    }

    // === Render ===
    return (
      <div className="page-content" style={{ padding: 24 }}>
        {/* Header */}
        <div style={{ marginBottom: 18 }}>
          <div style={{ fontSize: 22, fontWeight: 800, color: '#1B2A4A', display: 'flex', alignItems: 'center', gap: 8 }}>
            ✅ Aprovações de Frete
          </div>
          <div style={{ fontSize: 12, color: '#6B7280', marginTop: 2 }}>
            Pedidos de fechamento, SKU surpresa e qty extra solicitados pelo Abbes
          </div>
        </div>

        {/* Stats */}
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(160px, 1fr))', gap: 12, marginBottom: 20 }}>
          <StatCard label="Pendentes" value={stats.pending} color="#EA580C" highlight />
          <StatCard label="Aprovadas" value={stats.approved} color="#16A34A" />
          <StatCard label="Negadas" value={stats.denied} color="#6B7280" />
        </div>

        {/* Filtros + Lista [Wave 13 v223.38 extracted to AprovacaoFreteList.jsx] */}
        <AprovacaoFreteList
          filteredRequests={filteredRequests}
          filterStatus={filterStatus} setFilterStatus={setFilterStatus}
          filterType={filterType} setFilterType={setFilterType}
          noteMap={noteMap} carrierMap={carrierMap} productMap={productMap} userMap={userMap}
          loading={loading} error={error}
          isAdmin={isAdmin} user={user} canApprove={canApprove}
          inFlight={inFlight}
          onApprove={openApprove}
          onDeny={openDeny}
        />

        {/* MODAL APROVAR [Wave 13 v223.38 extracted to ApproveCloseRequestModal.jsx] */}
        {modalApproveId && selectedRequest && (
          <ApproveCloseRequestModal
            selectedRequest={selectedRequest}
            selectedNote={selectedNote}
            selectedCarrier={selectedCarrier}
            previewData={previewData}
            adminNotes={adminNotes} setAdminNotes={setAdminNotes}
            inFlight={inFlight}
            onConfirm={handleApprove}
            onClose={closeModals}
          />
        )}

        {/* MODAL NEGAR [Wave 13 v223.38 extracted to DenyCloseRequestModal.jsx] */}
        {modalDenyId && selectedRequest && (
          <DenyCloseRequestModal
            selectedRequest={selectedRequest}
            selectedNote={selectedNote}
            denyReason={denyReason} setDenyReason={setDenyReason}
            inFlight={inFlight}
            onConfirm={handleDeny}
            onClose={closeModals}
          />
        )}
      </div>
    );
  }

  // ══════════════════════════════════════════════════════════════
  // SUB-COMPONENTES
  // ══════════════════════════════════════════════════════════════

  function StatCard({ label, value, color, highlight }) {
    return (
      <div style={{
        background: highlight ? color + '11' : '#FFF',
        border: highlight ? `2px solid ${color}` : '1px solid #E4E7EC',
        borderRadius: 8, padding: 14,
      }}>
        <div style={{ color: '#9CA3AF', fontSize: 11, marginBottom: 6, textTransform: 'uppercase', letterSpacing: 0.5, fontWeight: 600 }}>{label}</div>
        <div style={{ fontSize: 28, fontWeight: 800, color: color || '#1B2A4A' }}>{value}</div>
      </div>
    );
  }

  // [Wave 13 v223.38] ViewStat + Field movidos pra ApproveCloseRequestModal.jsx + DenyCloseRequestModal.jsx (uso local nos widgets)

  // ══════════════════════════════════════════════════════════════
  // EXPORT
  // ══════════════════════════════════════════════════════════════
  window.ZNX = window.ZNX || {};
  window.ZNX.components = window.ZNX.components || {};
  window.ZNX.components.AprovacoesFrete = AprovacoesFrete;
  window.AprovacoesFrete = AprovacoesFrete;

  window.ZNX.refactor_phase_6_loaded = window.ZNX.refactor_phase_6_loaded || {};
  window.ZNX.refactor_phase_6_loaded.AprovacoesFrete = true;
})();
