// js/components/widgets/depositos/AjusteEstoqueModal.jsx
// [Wave 3 KIMI 2026-05-15] Extraído de Depositos.jsx — refactor mecânico zero-lógica.
// Self-contained: zero closures escopo pai.
// Globals runtime: window.sb (Supabase), toast, Modal, window.crypto.
//
// Props (preservadas byte-by-byte):
//   warehouse_id, product_id (alias initialProdId), warehouses, products, onClose, onDone
(function() {
  'use strict';
  const {useState, useMemo} = React;

  function AjusteEstoqueModal({warehouse_id, product_id: initialProdId, warehouses, products, onClose, onDone}){
    const sb = window.sb;
    const [productId, setProductId] = useState(initialProdId || '');
    const [search, setSearch] = useState(()=>{
      if(initialProdId){
        const p = (products||[]).find(p=>p.id===initialProdId);
        if(p) return `${p.brand||''} ${p.name||''}`.trim();
      }
      return '';
    });
    const [newQty, setNewQty] = useState('');
    const [reason, setReason] = useState('');
    const [submitting, setSubmitting] = useState(false);

    // [regra_state_id_vs_objeto] lookup fresco do produto + warehouse pelo ID
    const wh = useMemo(()=>warehouses.find(w=>w.id===warehouse_id), [warehouses, warehouse_id]);
    const product = useMemo(()=>(products||[]).find(p=>p.id===productId), [products, productId]);
    const currentQty = useMemo(()=>{
      if(!product) return 0;
      const bd = product.stock_breakdown || product.stockBreakdown || {};
      return Number(bd[warehouse_id] || 0);
    }, [product, warehouse_id]);
    const diff = newQty === '' ? null : Number(newQty) - currentQty;

    const filteredProds = useMemo(()=>{
      if(productId) return [];  // já selecionou
      if(!search || search.length<2) return [];
      const q = search.toLowerCase();
      return (products||[]).filter(p=>{
        const nm = (p.name||'').toLowerCase();
        const br = (p.brand||'').toLowerCase();
        const cd = (p.code||'').toLowerCase();
        return nm.includes(q) || br.includes(q) || cd.includes(q);
      }).slice(0,15);
    },[products, search, productId]);

    const submit = async ()=>{
      if(!productId){ toast('Selecione um produto','error'); return; }
      if(newQty === '' || isNaN(Number(newQty)) || Number(newQty) < 0){
        toast('Nova quantidade deve ser >= 0','error'); return;
      }
      if(reason.trim().length < 5){
        toast('Motivo obrigatório (mín 5 caracteres)','error'); return;
      }
      if(Number(newQty) === currentQty){
        toast('Nova quantidade igual à atual — nada a ajustar','info'); return;
      }
      setSubmitting(true);
      try{
        const idem = (window.crypto?.randomUUID?.() || (Date.now()+'-'+Math.random()));
        const {data, error} = await sb.rpc('warehouse_stock_adjust', {
          p_product_id: productId,
          p_warehouse_id: warehouse_id,
          p_new_qty: Number(newQty),
          p_reason: reason.trim(),
          p_idem_key: idem
        });
        if(error) throw error;
        const sign = data?.diff > 0 ? '+' : '';
        toast(`✅ Ajuste salvo: ${data?.old} → ${data?.new} (${sign}${data?.diff})`,'success');
        onDone();
      }catch(err){
        console.error('[AjusteEstoque]', err);
        toast('Erro: '+(err?.message||'falha'),'error');
      }
      setSubmitting(false);
    };

    return (
      <Modal onClose={onClose}>
        <div style={{padding:18,minWidth:420,maxWidth:520}}>
          <h3 style={{margin:'0 0 4px',fontSize:16,fontWeight:700,color:'#1B2A4A'}}>⚙️ Ajuste de Inventário</h3>
          <div style={{fontSize:11,color:'#6B7280',marginBottom:14}}>Depósito: <strong>{wh?.name||'?'}</strong></div>

          {!initialProdId && (
            <div style={{marginBottom:12}}>
              <label style={{fontSize:11,color:'#6B7280',fontWeight:600,display:'block',marginBottom:4}}>PRODUTO</label>
              <input type="text" value={search} onChange={e=>{setSearch(e.target.value); setProductId('');}}
                placeholder="Buscar por nome, marca, código..."
                style={{width:'100%',padding:'8px 10px',border:'1px solid #D1D5DB',borderRadius:5,fontSize:13}}/>
              {filteredProds.length>0 && (
                <div style={{maxHeight:160,overflow:'auto',border:'1px solid #E5E7EB',borderRadius:5,marginTop:4,background:'#fff'}}>
                  {filteredProds.map(p=>(
                    <div key={p.id} onClick={()=>{setProductId(p.id); setSearch(`${p.brand||''} ${p.name||''}`.trim());}}
                      style={{padding:8,cursor:'pointer',fontSize:12,borderBottom:'1px solid #F3F4F6'}}>
                      <strong>{p.brand}</strong> {p.name} <span style={{color:'#6B7280'}}>({p.volume||''})</span>
                    </div>
                  ))}
                </div>
              )}
            </div>
          )}

          {product && (
            <div style={{padding:10,background:'#F0F9FF',border:'1px solid #BAE6FD',borderRadius:5,marginBottom:12,fontSize:12}}>
              <div><strong>{product.brand} {product.name}</strong></div>
              <div style={{color:'#0C4A6E',marginTop:4}}>
                Estoque atual em {wh?.name}: <strong>{currentQty}</strong> un.
              </div>
            </div>
          )}

          <div style={{display:'grid',gridTemplateColumns:'1fr auto 1fr',gap:8,alignItems:'center',marginBottom:12}}>
            <div>
              <label style={{fontSize:11,color:'#6B7280',fontWeight:600,display:'block',marginBottom:4}}>NOVA QUANTIDADE</label>
              <input type="number" min="0" value={newQty} onChange={e=>setNewQty(e.target.value)}
                placeholder="Contagem física"
                style={{width:'100%',padding:'8px 10px',border:'1px solid #D1D5DB',borderRadius:5,fontSize:14,fontWeight:700}}/>
            </div>
            {diff !== null && diff !== 0 && (
              <div style={{textAlign:'center',fontSize:18,fontWeight:700,color:diff>0?'#15803D':'#B91C1C',paddingTop:18}}>
                {diff>0?'↑':'↓'}
              </div>
            )}
            {diff !== null && (
              <div style={{textAlign:'center',paddingTop:18}}>
                <div style={{fontSize:11,color:'#6B7280'}}>Diferença</div>
                <div style={{fontSize:14,fontWeight:700,color:diff>0?'#15803D':diff<0?'#B91C1C':'#6B7280'}}>
                  {diff>0?'+':''}{diff}
                </div>
              </div>
            )}
          </div>

          <div style={{marginBottom:14}}>
            <label style={{fontSize:11,color:'#6B7280',fontWeight:600,display:'block',marginBottom:4}}>MOTIVO (obrigatório, mín 5 chars)</label>
            <textarea value={reason} onChange={e=>setReason(e.target.value)}
              placeholder="Ex: Contagem física semanal, perda por avaria, ajuste de inventário inicial..."
              style={{width:'100%',padding:'8px 10px',border:'1px solid #D1D5DB',borderRadius:5,fontSize:13,resize:'vertical',minHeight:60}}/>
          </div>

          <div style={{padding:8,background:'#FEF3C7',borderRadius:5,fontSize:10,color:'#78350F',marginBottom:12}}>
            ⚠️ Ajuste manual fica registrado em audit log com motivo + diff + ator + idempotency key.
          </div>

          <div style={{display:'flex',gap:8,justifyContent:'flex-end'}}>
            <button onClick={onClose} disabled={submitting}
              style={{padding:'8px 16px',border:'1px solid #D1D5DB',background:'#fff',borderRadius:5,cursor:'pointer',fontSize:13}}>Cancelar</button>
            <button onClick={submit} disabled={submitting || !productId || newQty==='' || reason.trim().length<5}
              style={{padding:'8px 18px',background:submitting||!productId||newQty===''||reason.trim().length<5?'#9CA3AF':'#B89840',color:'#fff',border:'none',borderRadius:5,cursor:submitting?'not-allowed':'pointer',fontSize:13,fontWeight:700}}>
              {submitting?'Salvando...':'Confirmar Ajuste'}
            </button>
          </div>
        </div>
      </Modal>
    );
  }

  window.ZNX = window.ZNX || {};
  window.ZNX.widgets = window.ZNX.widgets || {};
  window.ZNX.widgets.depositos = window.ZNX.widgets.depositos || {};
  window.ZNX.widgets.depositos.AjusteEstoqueModal = AjusteEstoqueModal;
})();
