// Approvals — the pending queue + an approve/deny flow with the confused-deputy detail
function Approvals({ pending, onDecide }) {
  const [active, setActive] = React.useState(pending[0] ? pending[0].id : null);
  const [toast, setToast] = React.useState(null);
  React.useEffect(() => {
    if (!pending.find(p => p.id === active)) setActive(pending[0] ? pending[0].id : null);
  }, [pending, active]);

  const decide = (id, approved) => {
    onDecide(id, approved);
    setToast({ approved, id });
    setTimeout(() => setToast(null), 2600);
  };
  const sel = pending.find(p => p.id === active);

  return (
    <div className="content-wrap fadein">
      <div className="page-head">
        <div className="eb">Approvals</div>
        <h2>Actions waiting on a human</h2>
        <p>Each release is bound to one exact action fingerprint and the original instruction — approve action A, an agent still can't run action B, and a "yes" is good for exactly one execution.</p>
      </div>

      {pending.length === 0 ? (
        <div className="card" style={{padding:'48px',textAlign:'center'}}>
          <div style={{width:48,height:48,borderRadius:14,margin:'0 auto 14px',background:'rgba(6,201,140,.12)',border:'1px solid rgba(6,201,140,.34)',display:'grid',placeItems:'center',color:'var(--signal-400)'}}>
            <i data-lucide="check-check" style={{width:24,height:24}}></i>
          </div>
          <div style={{fontSize:16,fontWeight:600}}>Queue is clear</div>
          <div style={{fontSize:13.5,color:'var(--fg-muted)',marginTop:6}}>No actions are waiting on a human right now.</div>
        </div>
      ) : (
        <div style={{display:'grid',gridTemplateColumns:'300px 1fr',gap:16}}>
          {/* queue list */}
          <div style={{display:'flex',flexDirection:'column',gap:10}}>
            {pending.map(p =>
              <button key={p.id} onClick={() => setActive(p.id)}
                className="card" style={{padding:'14px 16px',textAlign:'left',cursor:'pointer',
                  borderColor:active===p.id?'var(--indigo-500)':'var(--ink-700)',
                  background:active===p.id?'linear-gradient(180deg,rgba(75,61,245,.08),var(--ink-900))':'var(--ink-900)'}}>
                <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:9}}>
                  <span className="pill pill-appr"><i data-lucide="clock"></i>{p.id}</span>
                  <span className="mono" style={{marginLeft:'auto',fontSize:11,color:'var(--ink-500)'}}>{p.age}</span>
                </div>
                <div style={{fontSize:13.5,color:'var(--fg)',lineHeight:1.4,marginBottom:8}}>{p.instruction}</div>
                <div style={{display:'flex',alignItems:'center',gap:7,fontSize:12,color:'var(--fg-muted)'}}>
                  <i data-lucide="bot" style={{width:14,height:14,color:'#3DEBB6'}}></i>
                  <span className="mono">{p.principal}</span>
                  <span className="mono" style={{marginLeft:'auto',color:'#F5B53F'}}>{p.amount}</span>
                </div>
              </button>)}
          </div>

          {/* detail */}
          {sel && <ApprovalDetail key={sel.id} p={sel} onDecide={decide}/>}
        </div>
      )}

      {toast && (
        <div style={{position:'fixed',bottom:24,left:'50%',transform:'translateX(-50%)',zIndex:60,
          display:'flex',alignItems:'center',gap:10,padding:'12px 18px',borderRadius:12,
          background:'var(--ink-850)',border:'1px solid '+(toast.approved?'rgba(6,201,140,.4)':'rgba(240,85,106,.4)'),
          boxShadow:'var(--shadow-lg)',animation:'fadein .2s var(--ease) both'}}>
          <i data-lucide={toast.approved?'badge-check':'shield-x'} style={{width:18,height:18,color:toast.approved?'#3DEBB6':'#F0728A'}}></i>
          <span style={{fontSize:13.5}}>{toast.id} {toast.approved ? 'approved' : 'denied'} · receipt signed &amp; appended</span>
        </div>
      )}
    </div>
  );
}

function ApprovalDetail({ p, onDecide }) {
  const rows = [
    ["instruction", `“${p.instruction}”`],
    ["principal", p.principal],
    ["action", `${p.method} ${p.host}${p.path}`],
    ["amount", p.amount],
    ["destination", p.destination],
    ["matched rule", p.rule],
    ["action_fingerprint", p.fpr],
    ["intent_hash", p.intent],
  ];
  return (
    <div className="card" style={{padding:'22px 24px',alignSelf:'start'}}>
      <div style={{display:'flex',alignItems:'center',gap:10,marginBottom:18}}>
        <div style={{width:36,height:36,borderRadius:10,background:'rgba(245,165,36,.12)',border:'1px solid rgba(245,165,36,.32)',display:'grid',placeItems:'center',color:'#F5B53F'}}>
          <i data-lucide="user-check" style={{width:19,height:19}}></i>
        </div>
        <div>
          <div style={{fontSize:15,fontWeight:600}}>Review &amp; release</div>
          <div className="mono" style={{fontSize:11.5,color:'var(--fg-muted)',marginTop:2}}>{p.id} · parked under <span style={{color:'#F5B53F'}}>{p.rule}</span></div>
        </div>
      </div>

      <div style={{display:'grid',gridTemplateColumns:'140px 1fr',gap:'10px 14px'}}>
        {rows.map(([k,v],i) =>
          <React.Fragment key={i}>
            <span className="mono" style={{fontSize:11.5,color:'var(--ink-500)'}}>{k}</span>
            <span className="mono" style={{fontSize:11.5,color:/fingerprint|hash/.test(k)?'#9A90FA':k==='amount'?'#F5B53F':'var(--fg)',wordBreak:'break-all',lineHeight:1.5}}>{v}</span>
          </React.Fragment>)}
      </div>

      <div style={{display:'flex',gap:9,alignItems:'flex-start',padding:'12px 14px',borderRadius:10,
        background:'rgba(75,61,245,.06)',border:'1px solid rgba(106,95,246,.24)',margin:'18px 0',fontSize:12.5,color:'var(--fg-2)',lineHeight:1.5}}>
        <i data-lucide="shield-check" style={{width:16,height:16,color:'#9A90FA',flexShrink:0,marginTop:1}}></i>
        Your decision is bound to this exact fingerprint &amp; instruction. A substituted action is refused; this approval releases the action once, then is consumed.
      </div>

      <div style={{display:'flex',gap:10}}>
        <button className="btn btn-allow" style={{flex:1,justifyContent:'center'}} onClick={() => onDecide(p.id, true)}>
          <i data-lucide="check"></i>Approve &amp; release
        </button>
        <button className="btn btn-deny" style={{flex:1,justifyContent:'center'}} onClick={() => onDecide(p.id, false)}>
          <i data-lucide="x"></i>Deny
        </button>
      </div>
    </div>
  );
}
window.Approvals = Approvals;
