// v-team.jsx — Team & Media: staff invites, media library, account verification, audit activity

// ─── Section shell (mirrors settings sections) ───────────────────────
function TMSection({ icon, title, sub, wire, children, footer }) {
  return (
    <Card pad={0} style={{ overflow:'hidden' }}>
      <div style={{ padding:'15px 20px 13px', borderBottom:'1px solid var(--soft-line)', display:'flex', alignItems:'center', justifyContent:'space-between', gap:12 }}>
        <div>
          <div style={{ display:'flex', alignItems:'center', gap:9 }}>
            <Eyebrow>{icon} &nbsp;{title}</Eyebrow>
            {wire && <Wire kind={wire}/>}
          </div>
          {sub && <div style={{ fontFamily:'var(--font-body)', fontSize:11.5, color:'var(--warm-stone)', marginTop:4 }}>{sub}</div>}
        </div>
        {footer}
      </div>
      <div style={{ padding:'16px 20px 18px' }}>{children}</div>
    </Card>
  );
}

// ─── Invite form + pending invites ───────────────────────────────────
function InvitePanel({ app }) {
  const [invites, setInvites] = React.useState(STAFF_INVITES);
  const [email, setEmail] = React.useState('');
  const [role, setRole] = React.useState('Staff');
  const [busy, setBusy] = React.useState(false);

  const send = () => {
    const em = email.trim();
    if (!em || !em.includes('@')) { app.toast('Enter a valid email to invite'); return; }
    setBusy(true);
    setTimeout(()=>{
      setInvites(v=>[{ id:'inv-'+Math.random().toString(16).slice(2,6), email:em, role, sent:'just now', status:'pending' }, ...v]);
      setEmail(''); setBusy(false);
      app.toast('Invite created — saved to the invites table');
    }, 700);
  };
  const revoke = (id) => {
    setInvites(v=>v.filter(i=>i.id!==id));
    app.toast('Invite revoked');
  };

  return (
    <TMSection icon={<I.users c="var(--brand-orange)" s={13}/>} title="Staff invites" wire="partial"
      sub="Invite creation and revoke write to the invites table. Email delivery isn't wired yet — share the invite link yourself for now.">
      {/* create */}
      <div style={{ display:'flex', gap:9, marginBottom:6 }}>
        <input value={email} onChange={e=>setEmail(e.target.value)} onKeyDown={e=>e.key==='Enter'&&send()} placeholder="teammate@email.com"
          style={{ flex:1, minWidth:0, boxSizing:'border-box', background:'rgba(255,255,255,0.55)', border:'1px solid var(--soft-line)', borderRadius:10, padding:'10px 12px', fontFamily:'var(--font-body)', fontSize:13, color:'var(--fg-primary)', outline:'none' }}/>
        <Segmented size="sm" options={['Manager','Staff']} value={role} onChange={setRole}/>
        <Btn kind="accent" size="sm" onClick={send} disabled={busy} icon={busy?<span style={{ display:'inline-flex', animation:'v-spin 800ms linear infinite' }}><I.refresh c="#fff" s={13}/></span>:<I.plus c="#fff" s={13}/>}>{busy?'Saving…':'Invite'}</Btn>
      </div>
      <div style={{ display:'flex', alignItems:'center', gap:7, marginBottom:14 }}>
        <I.info c="var(--warm-stone)" s={12}/>
        <span style={{ fontFamily:'var(--font-body)', fontSize:11, color:'var(--warm-stone)' }}>Managers get menu, orders, campaigns &amp; insights. Staff get orders only.</span>
      </div>

      {/* pending list */}
      {invites.map((inv,i)=>(
        <div key={inv.id} style={{ display:'flex', alignItems:'center', gap:12, padding:'11px 0', borderTop:'1px solid var(--soft-line)' }}>
          <div style={{ width:34, height:34, borderRadius:'50%', background:'var(--bg-warm)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
            <I.clock c={inv.status==='expired'?'var(--warm-stone)':'var(--brand-orange)'} s={15}/>
          </div>
          <div style={{ flex:1, minWidth:0 }}>
            <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13, color:'var(--fg-primary)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{inv.email}</div>
            <div style={{ fontFamily:'var(--font-body)', fontSize:10.5, color:'var(--warm-stone)', marginTop:2 }}>Sent {inv.sent} · {inv.role}</div>
          </div>
          <Pill tone={inv.status==='expired'?'grey':'amber'} dot>{inv.status==='expired'?'Expired':'Pending'}</Pill>
          <span title="Accept flow ships with the invite-accept contract" style={{ cursor:'help' }}>
            <Btn kind="white" size="sm" disabled>Resend</Btn>
          </span>
          <Btn kind="white" size="sm" style={{ color:'#b0341a' }} onClick={()=>revoke(inv.id)}>Revoke</Btn>
        </div>
      ))}
      <div style={{ marginTop:12, display:'flex', alignItems:'center', gap:8, padding:'10px 12px', background:'rgba(224,153,42,0.08)', border:'1px solid rgba(224,153,42,0.25)', borderRadius:11 }}>
        <Wire kind="pending"/>
        <span style={{ fontFamily:'var(--font-body)', fontSize:11.5, color:'var(--warm-stone)' }}>Email delivery &amp; one-tap accept are disabled until their backend contract is validated.</span>
      </div>
    </TMSection>
  );
}

// ─── Media library (private lasso-media bucket) ──────────────────────
function MediaPanel({ app }) {
  const [assets, setAssets] = React.useState(MEDIA_ASSETS);
  const [drag, setDrag] = React.useState(false);
  const fileRef = React.useRef(null);

  const addFiles = (files) => {
    const list = Array.from(files||[]).filter(f=>f.type.startsWith('image/'));
    if (!list.length) { app.toast('Drop image files (JPG / PNG / WebP)'); return; }
    list.forEach(f=>{
      const id = 'md-'+Math.random().toString(16).slice(2,6);
      setAssets(a=>[{ id, name:f.name, kind:'Item photo', size:Math.round(f.size/1024)+' KB', path:'fd-2841/menu/'+f.name, status:'uploading', linked:null }, ...a]);
      setTimeout(()=> setAssets(a=>a.map(x=>x.id===id?{...x,status:'processing'}:x)), 1400);
      setTimeout(()=> setAssets(a=>a.map(x=>x.id===id?{...x,status:'live'}:x)), 3200);
    });
    app.toast(`Uploading ${list.length} file${list.length>1?'s':''} to your private media bucket…`);
  };

  const M_TONE = { live:'green', processing:'amber', uploading:'blue', archived:'grey' };
  const M_LABEL = { live:'Live', processing:'Processing', uploading:'Uploading…', archived:'Archived' };

  return (
    <TMSection icon={<I.image c="var(--brand-orange)" s={13}/>} title="Media library" wire="partial"
      sub="Uploads go to your private, vendor-scoped storage bucket. Only your kitchen can touch these files.">
      {/* dropzone */}
      <div
        onDragOver={e=>{ e.preventDefault(); setDrag(true); }} onDragLeave={()=>setDrag(false)}
        onDrop={e=>{ e.preventDefault(); setDrag(false); addFiles(e.dataTransfer.files); }}
        onClick={()=>fileRef.current && fileRef.current.click()}
        style={{ border:'1.5px dashed', borderColor: drag?'var(--brand-orange)':'var(--soft-line)', borderRadius:14, padding:'22px 16px', textAlign:'center', cursor:'pointer', background: drag?'rgba(242,140,27,0.07)':'rgba(255,255,255,0.35)', transition:'all 160ms', marginBottom:14 }}>
        <input ref={fileRef} type="file" accept="image/*" multiple style={{ display:'none' }} onChange={e=>{ addFiles(e.target.files); e.target.value=''; }}/>
        <I.image c="var(--brand-orange)" s={24}/>
        <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13.5, color:'var(--fg-primary)', marginTop:8 }}>Drop photos here, or click to upload</div>
        <div style={{ fontFamily:'var(--font-mono)', fontSize:10.5, color:'var(--warm-stone)', marginTop:5 }}>lasso-media / fd-2841 / … · private bucket</div>
      </div>

      {/* asset rows */}
      {assets.map((a)=>(
        <div key={a.id} style={{ display:'flex', alignItems:'center', gap:12, padding:'10px 0', borderTop:'1px solid var(--soft-line)' }}>
          <div style={{ width:40, height:40, borderRadius:10, background:'var(--bg-warm)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
            {a.status==='uploading'||a.status==='processing'
              ? <span style={{ display:'inline-flex', animation:'v-spin 900ms linear infinite' }}><I.refresh c="var(--brand-orange)" s={16}/></span>
              : <I.image c="var(--horse-brown)" s={17}/>}
          </div>
          <div style={{ flex:1, minWidth:0 }}>
            <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:12.5, color:'var(--fg-primary)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{a.name}</div>
            <div style={{ fontFamily:'var(--font-mono)', fontSize:10, color:'var(--warm-stone)', marginTop:2, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{a.path} · {a.size}</div>
          </div>
          {a.linked && <Pill tone="blue" style={{ fontSize:10 }}>{a.linked}</Pill>}
          <Pill tone={M_TONE[a.status]} dot={a.status==='live'}>{M_LABEL[a.status]}</Pill>
          <span title="Archive & moderation ship with the media-ownership contract" style={{ cursor:'help' }}>
            <Btn kind="white" size="sm" disabled>Archive</Btn>
          </span>
        </div>
      ))}
      <div style={{ marginTop:12, display:'flex', alignItems:'center', gap:8, padding:'10px 12px', background:'rgba(224,153,42,0.08)', border:'1px solid rgba(224,153,42,0.25)', borderRadius:11 }}>
        <Wire kind="pending"/>
        <span style={{ fontFamily:'var(--font-body)', fontSize:11.5, color:'var(--warm-stone)' }}>Archive &amp; moderation are disabled until the ownership contract supports them. Uploads, replaces and deletes are live.</span>
      </div>
    </TMSection>
  );
}

// ─── Account verification tracker ────────────────────────────────────
function OnboardPanel() {
  return (
    <TMSection icon={<I.shield c="var(--brand-orange)" s={13}/>} title="Account verification" wire="partial"
      sub="Where Fire & Dough stands in Lasso's vendor checks.">
      {ONBOARD_STEPS.map((s,i)=>(
        <div key={s.id} style={{ display:'flex', gap:12, alignItems:'flex-start', paddingBottom: i<ONBOARD_STEPS.length-1?16:0, position:'relative' }}>
          {i<ONBOARD_STEPS.length-1 && <span style={{ position:'absolute', left:11, top:26, bottom:-2, width:2, background: s.state==='done'?'rgba(46,139,78,0.35)':'var(--soft-line)' }}/>}
          <div style={{ width:24, height:24, borderRadius:'50%', flexShrink:0, display:'flex', alignItems:'center', justifyContent:'center', background: s.state==='done'?'var(--live-green)':'var(--bg-warm)', border: s.state==='done'?'none':'1.5px dashed var(--warm-stone)', zIndex:1 }}>
            {s.state==='done' ? <I.check c="#fff" s={13}/> : <I.clock c="var(--warm-stone)" s={12}/>}
          </div>
          <div style={{ flex:1, minWidth:0 }}>
            <div style={{ display:'flex', alignItems:'center', gap:8, flexWrap:'wrap' }}>
              <span style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13, color:'var(--fg-primary)' }}>{s.label}</span>
              {s.state!=='done' && <Pill tone="amber">In review</Pill>}
            </div>
            <div style={{ fontFamily:'var(--font-body)', fontSize:11.5, color:'var(--warm-stone)', marginTop:3 }}>{s.note}</div>
          </div>
        </div>
      ))}
    </TMSection>
  );
}

// ─── Audit activity (read-only) ──────────────────────────────────────
function AuditPanel() {
  const K_ICON = { orders:'receipt', campaigns:'megaphone', team:'users', media:'image', menu:'utensils' };
  return (
    <TMSection icon={<I.bookmark c="var(--brand-orange)" s={13}/>} title="Recent activity" wire="live"
      sub="Read-only audit trail. A row is written only when something actually changes.">
      {AUDIT_ROWS.map((r,i)=>{
        const Icon = I[K_ICON[r.kind]] || I.grid;
        return (
          <div key={i} style={{ display:'flex', alignItems:'center', gap:11, padding:'9px 0', borderTop: i>0?'1px solid var(--soft-line)':'none' }}>
            <div style={{ width:30, height:30, borderRadius:9, background:'var(--bg-warm)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}><Icon c="var(--horse-brown)" s={14}/></div>
            <div style={{ flex:1, minWidth:0 }}>
              <div style={{ fontFamily:'var(--font-body)', fontSize:12.5, color:'var(--fg-primary)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>
                <strong style={{ fontFamily:'var(--font-display)' }}>{r.actor}</strong> · {r.action}
              </div>
              <div style={{ fontFamily:'var(--font-body)', fontSize:10.5, color:'var(--warm-stone)', marginTop:1, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{r.target}</div>
            </div>
            <span style={{ fontFamily:'var(--font-mono)', fontSize:10, color:'var(--warm-stone)', flexShrink:0 }}>{r.when}</span>
          </div>
        );
      })}
    </TMSection>
  );
}

// ─── Screen ──────────────────────────────────────────────────────────
function TeamScreen({ app }) {
  return (
    <div>
      <PageHead eyebrow="Team & Media" title="Team, media &amp; account"
        sub="Who can work this dashboard, your photo library, verification status and the audit trail."/>
      <div style={{ display:'grid', gridTemplateColumns:'1.25fr 1fr', gap:16, alignItems:'start' }}>
        <div style={{ display:'flex', flexDirection:'column', gap:16 }}>
          <InvitePanel app={app}/>
          <MediaPanel app={app}/>
        </div>
        <div style={{ display:'flex', flexDirection:'column', gap:16 }}>
          <OnboardPanel/>
          <AuditPanel/>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { TeamScreen });
