// js/components/widgets/clientes/CreditModal.jsx
// [Wave 17 v223.43 20260521] Modal crédito (add/remove) — extraído de Clientes.jsx L839-901
// Props: creditModal ({clientId, clientName, type, value, reason}), setCreditModal, setClients, setCreditHistory
// Deps runtime: window.Modal, window.sb (Supabase), window.fmt, window.toast, window.Sentry
(function(){
  'use strict';
  const {useState, useRef} = React;

  function CreditModal(props){
    const creditModal = props.creditModal;
    const setCreditModal = props.setCreditModal || function(){};
    const setClients = props.setClients || function(){};
    const setCreditHistory = props.setCreditHistory || function(){};

    const Modal = window.Modal;
    if (!Modal) {
      if (window.Sentry && typeof window.Sentry.captureMessage === 'function') {
        try { window.Sentry.captureMessage('[Wave 17 v223.43] CreditModal missing Modal', 'error'); } catch(e){}
      }
      console.error('[CreditModal] Modal faltando');
      return null;
    }

    const inFlightRef = useRef(false);
    const [creditSaving, setCreditSaving] = useState(false);
    const fmt = (typeof window.fmt === 'function') ? window.fmt : function(v){ return 'R$ '+Number(v||0).toFixed(2); };
    const toast = (typeof window.toast === 'function') ? window.toast : function(m){ console.log('[toast]', m); };

    if (!creditModal) return null;

    async function handleSave(){
      if (inFlightRef.current) return;
      const val = Number(creditModal.value);
      if (!val || val <= 0) { toast('⚠ Valor inválido'); return; }
      if (!creditModal.reason || creditModal.reason.trim().length < 3) { toast('⚠ Motivo obrigatório (mín 3 caracteres)'); return; }
      inFlightRef.current = true;
      setCreditSaving(true);
      try {
        const idemKey = (typeof window !== 'undefined' && typeof window.genIdempotencyKey === 'function')
          ? window.genIdempotencyKey()
          : (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function' ? crypto.randomUUID() : null);
        if (idemKey) {
          try { await window.sb.rpc('set_idem_key', { p_key: idemKey }); }
          catch(e){
            console.error('[v224.71 CreditModal set_idem_key] idempotency comprometida:', e);
            if(window.Sentry) window.Sentry.captureException(e,{tags:{wave:'v224.71',critical:'idempotency_lost'}});
          }
        }
        const { data, error } = await window.sb.rpc('add_client_credit', {
          p_client_id: creditModal.clientId,
          p_value: val,
          p_reason: creditModal.reason.trim(),
          p_movement_type: creditModal.type
        });
        if (error) {
          toast('❌ '+error.message);
          if (window.Sentry) window.Sentry.captureException(new Error(error.message), { extra: { context: 'creditModal', clientId: creditModal.clientId, value: val, type: creditModal.type } });
          return;
        }
        // Recarregar histórico + cliente
        const { data: hist } = await window.sb.from('client_credit_history').select('*').eq('client_id', creditModal.clientId).order('created_at', { ascending: false }).limit(50);
        setCreditHistory(Array.isArray(hist) ? hist : []);
        setClients(function(prev){
          return prev.map(function(c){
            return c.id === creditModal.clientId
              ? Object.assign({}, c, { creditBalance: (data && data.new_balance) || 0, credit_balance: (data && data.new_balance) || 0 })
              : c;
          });
        });
        toast('✅ Crédito atualizado: '+fmt((data && data.new_balance) || 0));
        setCreditModal(null);
      } catch(e) {
        toast('❌ '+(e.message || 'Erro'));
        if (window.Sentry) window.Sentry.captureException(e, { extra: { context: 'creditModal_exception', clientId: creditModal.clientId } });
      } finally {
        inFlightRef.current = false;
        setCreditSaving(false);
      }
    }

    return (
      <Modal title={(creditModal.type === 'add' ? '+ Adicionar' : '− Remover')+' Crédito — '+creditModal.clientName} onClose={function(){ setCreditModal(null); }}>
        <div style={{display:'flex',flexDirection:'column',gap:12}}>
          <div className="form-group">
            <label>Valor (R$)</label>
            <input type="number" min="0.01" step="0.01" value={creditModal.value}
              onChange={function(e){ setCreditModal(Object.assign({}, creditModal, { value: e.target.value })); }}
              placeholder="0,00" autoFocus/>
          </div>
          <div className="form-group">
            <label>Motivo (obrigatório)</label>
            <input type="text" value={creditModal.reason}
              onChange={function(e){ setCreditModal(Object.assign({}, creditModal, { reason: e.target.value })); }}
              placeholder="Ex: devolução produto, fidelidade, promoção"/>
          </div>
          <div style={{display:'flex',gap:10,marginTop:8,justifyContent:'flex-end'}}>
            <button className="btn-outline" onClick={function(){ setCreditModal(null); }} disabled={creditSaving}>Cancelar</button>
            <button className={creditModal.type === 'add' ? 'btn-gold' : 'btn-danger'} disabled={creditSaving} onClick={handleSave}>
              {creditSaving ? '⏳ Processando...' : (creditModal.type === 'add' ? '+ Adicionar' : '− Remover')}
            </button>
          </div>
        </div>
      </Modal>
    );
  }

  window.ZNX = window.ZNX || {};
  window.ZNX.widgets = window.ZNX.widgets || {};
  window.ZNX.widgets.clientes = window.ZNX.widgets.clientes || {};
  window.ZNX.widgets.clientes.CreditModal = CreditModal;
  window.CreditModalClientes = CreditModal; // alias
})();
