// admin.jsx — LBC back-office screens + shell
const { useState: useAd, useEffect: useAdE } = React;
/* Badges « non vus » : on mémorise les ids déjà vus par section ; le badge = nb d'éléments nouveaux. */
const LBC_SEEN_LS = 'lbc_seen_v1';
function lbcLoadSeen(){ try{ return JSON.parse(localStorage.getItem(LBC_SEEN_LS)||'{}'); }catch(e){ return {}; } }
function lbcSaveSeen(s){ try{ localStorage.setItem(LBC_SEEN_LS, JSON.stringify(s)); }catch(e){} }

function TierPill({ tier, small }) {
  const c = window.LBC_ADMIN.TIER_COLOR[tier] || 'var(--muted)';
  return (
    <span style={{ display:'inline-flex', alignItems:'center', gap:6, fontSize: small?11.5:12.5, fontWeight:600,
      padding: small?'2px 9px':'3px 10px', borderRadius:999, background:c+'1f', color:c, whiteSpace:'nowrap' }}>
      <span style={{ width:6, height:6, borderRadius:'50%', background:c }} />{tier}</span>
  );
}

/* ============== OVERVIEW ============== */
function AdminOverview({ go, mobile }) {
  const A = window.LBC_ADMIN, agg = A.adminAgg();
  const diff = agg.leadsMonth - agg.leadsPrev;
  const kpis = [
    { label:'Partenaires actifs', value:agg.active, sub:`+${A.PENDING_PARTNERS.length} candidatures en attente`, icon:'building' },
    { label:'Leads réseau · mai', value:agg.leadsMonth, trend:`+${diff} vs avril`, trendDir:'up', icon:'inbox' },
    { label:'Volume généré', value:euro(agg.volume), sub:'cumul réseau 2026', icon:'package' },
    { label:'Commissions à verser', value:euro(agg.pending), sub:'prochain run · 5 juin', icon:'euroCircle' },
  ];
  const top = [...A.PARTNERS].sort((a,b)=>b.volume-a.volume).slice(0,5);
  const maxVol = top[0].volume;

  return (
    <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr 1fr':'repeat(4,1fr)', gap: mobile?12:18 }}>
        {kpis.map((k,i)=><KPICard key={i} {...k} delay={i*55} />)}
      </div>

      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr':'1.5fr 1fr', gap:18 }}>
        <div className="card card-pad">
          <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', marginBottom:6 }}>
            <span className="section-title" style={{ fontSize:16 }}>Leads du réseau</span>
            <span style={{ fontSize:12.5, color:'var(--muted)' }}>6 derniers mois</span>
          </div>
          <AreaChart data={A.ADMIN_MONTHLY} color="var(--brand)" fmt={(n)=>n+' leads'} />
        </div>
        <div className="card card-pad">
          <span className="section-title" style={{ fontSize:16, display:'block', marginBottom:16 }}>Répartition des statuts</span>
          <Donut segments={A.ADMIN_STATUS_DIST} />
        </div>
      </div>

      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr':'1fr 1.4fr', gap:18, alignItems:'start' }}>
        <div className="card card-pad">
          <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', marginBottom:16 }}>
            <span className="section-title" style={{ fontSize:16 }}>Top partenaires</span>
            <a onClick={()=>go('partners')} style={{ fontSize:13, color:'var(--brand)', fontWeight:600 }}>Tous →</a>
          </div>
          <div style={{ display:'flex', flexDirection:'column', gap:15 }}>
            {top.map((p,i)=>(
              <div key={p.id} style={{ display:'flex', alignItems:'center', gap:12 }}>
                <span className="tnum" style={{ fontSize:12.5, color:'var(--faint)', width:14 }}>{i+1}</span>
                <Avatar initials={p.initials} size={32} color="var(--navy)" />
                <div style={{ flex:1, minWidth:0 }}>
                  <div style={{ fontSize:13.5, fontWeight:600, color:'var(--ink)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{p.company}</div>
                  <div style={{ marginTop:5, height:5, background:'var(--bg)', borderRadius:999, overflow:'hidden' }}>
                    <div style={{ width:`${(p.volume/maxVol)*100}%`, height:'100%', background:window.LBC_ADMIN.TIER_COLOR[p.tier], borderRadius:999 }} /></div>
                </div>
                <span className="tnum" style={{ fontSize:13, fontWeight:600, color:'var(--ink)' }}>{euro(p.volume)}</span>
              </div>
            ))}
          </div>
        </div>

        <div className="card" style={{ overflow:'hidden' }}>
          <div style={{ padding:'18px 20px', borderBottom:'1px solid var(--border)', display:'flex', justifyContent:'space-between', alignItems:'center' }}>
            <span className="section-title" style={{ fontSize:16 }}>Leads récents · réseau</span>
            <a onClick={()=>go('net-leads')} style={{ fontSize:13, color:'var(--brand)', fontWeight:600 }}>Voir tout →</a>
          </div>
          {mobile ? (
            <div>
              {window.LBC_ADMIN.NET_LEADS.slice(0,6).map(l=>(
                <div key={l.id} style={{ padding:'13px 16px', borderBottom:'1px solid var(--border)', display:'flex', justifyContent:'space-between', alignItems:'center', gap:10 }}>
                  <div style={{ minWidth:0 }}>
                    <div style={{ fontWeight:600, fontSize:14, color:'var(--ink)' }}>{l.client}</div>
                    <div style={{ fontSize:12, color:'var(--muted)', marginTop:3, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{l.partner}</div>
                    <div style={{ marginTop:6 }}><StatusBadge status={l.status} pulse /></div>
                  </div>
                  <span className="tnum" style={{ fontWeight:600, fontSize:13.5, color: l.commission?'var(--ink)':'var(--faint)', whiteSpace:'nowrap' }}>{l.commission?euro(l.commission):'—'}</span>
                </div>
              ))}
            </div>
          ) : (
          <div style={{ padding:'8px 4px' }}>
            <table className="tbl">
              <thead><tr><th>Client</th><th>Partenaire</th><th>Trajet</th><th>Statut</th><th style={{textAlign:'right'}}>Commission</th></tr></thead>
              <tbody>
                {window.LBC_ADMIN.NET_LEADS.slice(0,6).map(l=>(
                  <tr key={l.id}>
                    <td className="cell-client">{l.client}</td>
                    <td style={{ color:'var(--ink-2)' }}>{l.partner}</td>
                    <td><Route from={l.from} to={l.to} /></td>
                    <td><StatusBadge status={l.status} pulse /></td>
                    <td className="tnum" style={{ textAlign:'right', fontWeight:600, color: l.commission?'var(--ink)':'var(--faint)' }}>{l.commission?euro(l.commission):'—'}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
          )}
        </div>
      </div>
    </div>
  );
}

/* ============== PARTNERS ============== */
function AdminPartners({ showToast, mobile, go }) {
  const [pending, setPending] = useAd(window.LBC_ADMIN.PENDING_PARTNERS);
  const partners = window.LBC_ADMIN.PARTNERS;
  const act = (p, ok) => { setPending(ps=>ps.filter(x=>x.id!==p.id)); showToast(ok?`${p.company} approuvé — accès activé`:`Candidature de ${p.company} refusée`); };

  return (
    <div style={{ display:'flex', flexDirection:'column', gap:20 }}>
      {pending.length>0 && (
        <div>
          <div style={{ display:'flex', alignItems:'center', gap:9, marginBottom:12 }}>
            <span className="section-title" style={{ fontSize:16 }}>Candidatures en attente</span>
            <span style={{ fontSize:12, fontWeight:700, color:'#fff', background:'var(--brand)', padding:'2px 9px', borderRadius:999 }}>{pending.length}</span>
          </div>
          <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr':'1fr 1fr', gap:14 }}>
            {pending.map(p=>(
              <div key={p.id} className="card card-pad" style={{ display:'flex', gap:14, alignItems:'flex-start' }}>
                <Avatar initials={p.initials} size={44} color="#C77A0A" />
                <div style={{ flex:1, minWidth:0 }}>
                  <div style={{ fontSize:15, fontWeight:600, color:'var(--ink)' }}>{p.company}</div>
                  <div style={{ fontSize:13, color:'var(--muted)', marginTop:2 }}>{p.contact} · {p.type} · {p.city}</div>
                  <div style={{ fontSize:12, color:'var(--faint)', marginTop:4 }}>{p.email} · {p.applied}</div>
                  <div style={{ display:'flex', gap:9, marginTop:14 }}>
                    <button className="btn btn-primary btn-sm" onClick={()=>act(p,true)}><Icon name="check" size={15} />Approuver</button>
                    <button className="btn btn-ghost btn-sm" onClick={()=>act(p,false)}>Refuser</button>
                  </div>
                </div>
              </div>
            ))}
          </div>
        </div>
      )}

      <div className="card" style={{ overflow:'hidden' }}>
        <div style={{ padding:'18px 20px', borderBottom:'1px solid var(--border)' }}>
          <span className="section-title" style={{ fontSize:16 }}>Partenaires actifs · {partners.length}</span>
        </div>
        {mobile ? (
          <div>
            {partners.map(p=>(
              <div key={p.id} onClick={()=>go('partner-detail',{id:p.id})} style={{ padding:'14px 16px', borderBottom:'1px solid var(--border)', display:'flex', gap:12, alignItems:'center', cursor:'pointer' }}>
                <Avatar initials={p.initials} size={36} color="var(--navy)" />
                <div style={{ flex:1, minWidth:0 }}>
                  <div style={{ display:'flex', alignItems:'center', gap:8, justifyContent:'space-between' }}>
                    <span className="cell-client" style={{ whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{p.company}</span>
                    <TierPill tier={p.tier} small />
                  </div>
                  <div style={{ display:'flex', gap:'4px 14px', flexWrap:'wrap', marginTop:6, fontSize:12, color:'var(--muted)' }}>
                    <span>{p.leads} leads</span>
                    <span className="tnum" style={{ color:'var(--ink-2)', fontWeight:600 }}>{euro(p.volume)}</span>
                    {p.pending>0 && <span className="tnum" style={{ color:'var(--accepte)', fontWeight:600 }}>{euro(p.pending)} à verser</span>}
                  </div>
                </div>
              </div>
            ))}
          </div>
        ) : (
        <div style={{ padding:'8px 4px', overflowX:'auto' }}>
          <table className="tbl">
            <thead><tr><th>Société</th><th>Contact</th><th>Type</th><th>Niveau</th><th style={{textAlign:'right'}}>Leads</th><th style={{textAlign:'right'}}>Volume</th><th style={{textAlign:'right'}}>À verser</th></tr></thead>
            <tbody>
              {partners.map(p=>(
                <tr key={p.id} onClick={()=>go('partner-detail',{id:p.id})}>
                  <td><div style={{ display:'flex', alignItems:'center', gap:11 }}><Avatar initials={p.initials} size={30} color="var(--navy)" />
                    <div><div className="cell-client">{p.company}</div><div style={{ fontSize:12, color:'var(--faint)' }}>{p.city} · depuis {p.since}</div></div></div></td>
                  <td style={{ color:'var(--ink-2)' }}>{p.contact}</td>
                  <td style={{ color:'var(--muted)' }}>{p.type}</td>
                  <td><TierPill tier={p.tier} /></td>
                  <td className="tnum" style={{ textAlign:'right', fontWeight:500 }}>{p.leads}</td>
                  <td className="tnum" style={{ textAlign:'right', fontWeight:600, color:'var(--ink)' }}>{euro(p.volume)}</td>
                  <td className="tnum" style={{ textAlign:'right', fontWeight:600, color: p.pending?'var(--accepte)':'var(--faint)' }}>{p.pending?euro(p.pending):'—'}</td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
        )}
      </div>
    </div>
  );
}

/* ============== NET LEADS ============== */
const ANET_TABS = [
  { key:'all', label:'Tous', f:()=>true },
  { key:'cours', label:'En cours', f:l=>['recu','devis'].includes(l.status) },
  { key:'acceptes', label:'Acceptés', f:l=>l.status==='accepte' },
  { key:'effectues', label:'Effectués', f:l=>['effectue','verse'].includes(l.status) },
  { key:'perdus', label:'Perdus', f:l=>l.status==='perdu' },
];
function AdminLeads({ showToast, mobile }) {
  const [tab, setTab] = useAd('all');
  const [q, setQ] = useAd('');
  const tf = ANET_TABS.find(t=>t.key===tab).f;
  const rows = window.LBC_ADMIN.NET_LEADS.filter(l=>tf(l) && `${l.client} ${l.partner} ${l.from} ${l.to}`.toLowerCase().includes(q.toLowerCase()));
  const exportCSV = () => {
    const headers=['ID','Client','Partenaire','Départ','Arrivée','Statut','Valeur (€)','Commission (€)','Date'];
    const data=rows.map(l=>[l.id,l.client,l.partner,l.from,l.to,window.LBC_DATA.STATUS[l.status].label,l.value,l.commission||'',l.date]);
    const esc=v=>`"${String(v??'').replace(/"/g,'""')}"`;
    window.downloadFile('lbc-reseau-leads.csv', '\ufeff'+[headers,...data].map(r=>r.map(esc).join(';')).join('\r\n'),'text/csv;charset=utf-8');
    showToast('Export CSV du réseau téléchargé');
  };
  return (
    <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'flex', flexDirection: mobile?'column':'row', gap:12, justifyContent:'space-between' }}>
        <div style={{ display:'flex', gap:4, overflowX:'auto' }}>
          {ANET_TABS.map(t=>{
            const n = window.LBC_ADMIN.NET_LEADS.filter(t.f).length;
            return <button key={t.key} onClick={()=>setTab(t.key)} style={{ display:'inline-flex', alignItems:'center', gap:7, fontSize:13.5, fontWeight:600, padding:'8px 14px', borderRadius:9, whiteSpace:'nowrap',
              color: tab===t.key?'var(--ink)':'var(--muted)', background: tab===t.key?'var(--card)':'transparent', border:'1px solid', borderColor: tab===t.key?'var(--border-2)':'transparent', boxShadow: tab===t.key?'var(--shadow-xs)':'none' }}>
              {t.label}<span style={{ fontSize:11.5, padding:'1px 7px', borderRadius:999, background: tab===t.key?'var(--bg)':'rgba(20,56,78,.06)', color:'var(--muted)' }}>{n}</span></button>;
          })}
        </div>
        <div style={{ display:'flex', gap:10 }}>
          <div className="input-wrap" style={{ flex:1 }}><span className="lead-icon"><Icon name="search" size={16} /></span>
            <input className="input has-icon" value={q} onChange={e=>setQ(e.target.value)} placeholder="Client ou partenaire…" style={{ height:40, width: mobile?'100%':240 }} /></div>
          <button className="btn btn-ghost btn-sm" style={{ height:40 }} onClick={exportCSV}><Icon name="download" size={16} />CSV</button>
        </div>
      </div>
      <div className="card" style={{ overflow:'hidden', padding: mobile?0:'8px 4px' }}>
        {mobile ? (
          <div>
            {rows.map(l=>(
              <div key={l.id} style={{ padding:'14px 16px', borderBottom:'1px solid var(--border)', display:'flex', flexDirection:'column', gap:8 }}>
                <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', gap:10 }}>
                  <span style={{ fontWeight:600, fontSize:14.5, color:'var(--ink)' }}>{l.client}</span>
                  <StatusBadge status={l.status} pulse />
                </div>
                <div style={{ display:'flex', alignItems:'center', gap:8, fontSize:12.5, color:'var(--muted)' }}>
                  <Avatar initials={l.initials} size={20} color="var(--navy)" /><span style={{ whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{l.partner}</span>
                </div>
                <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', fontSize:13 }}>
                  <Route from={l.from} to={l.to} />
                  <span className="tnum" style={{ fontWeight:600, color: l.commission?'var(--ink)':'var(--faint)' }}>{l.commission?euro(l.commission):'—'}</span>
                </div>
              </div>
            ))}
          </div>
        ) : (
        <div style={{ overflowX:'auto' }}>
          <table className="tbl">
            <thead><tr><th>Client</th><th>Partenaire</th><th>Trajet</th><th>Date</th><th>Valeur</th><th>Statut</th><th style={{textAlign:'right'}}>Commission</th></tr></thead>
            <tbody>
              {rows.map(l=>(
                <tr key={l.id}>
                  <td className="cell-client">{l.client}</td>
                  <td><span style={{ display:'inline-flex', alignItems:'center', gap:8 }}><Avatar initials={l.initials} size={24} color="var(--navy)" /><span style={{ color:'var(--ink-2)', fontWeight:500 }}>{l.partner}</span></span></td>
                  <td><Route from={l.from} to={l.to} /></td>
                  <td style={{ color:'var(--muted)' }}>{l.date}</td>
                  <td className="tnum" style={{ fontWeight:500 }}>{euro(l.value)}</td>
                  <td><StatusBadge status={l.status} pulse /></td>
                  <td className="tnum" style={{ textAlign:'right', fontWeight:600, color:l.commission?'var(--ink)':'var(--faint)' }}>{l.commission?euro(l.commission):'—'}</td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
        )}
      </div>
    </div>
  );
}

/* ============== PAYOUTS ============== */
function AdminPayouts({ showToast, mobile }) {
  const withPending = window.LBC_ADMIN.PARTNERS.filter(p=>p.pending>0);
  const [paid, setPaid] = useAd([]);
  const remaining = withPending.filter(p=>!paid.includes(p.id)).reduce((s,p)=>s+p.pending,0);
  const totalVerse = window.LBC_ADMIN.PARTNERS.reduce((s,p)=>s+p.verse,0);
  const validate = (p) => { setPaid(ps=>[...ps,p.id]); showToast(`Versement de ${euro(p.pending)} validé pour ${p.company}`); };
  const validateAll = () => { setPaid(withPending.map(p=>p.id)); showToast('Lot de versements validé · '+euro(remaining)); };

  const metrics = [
    { label:'À verser ce mois', value:euro(remaining), sub:`${withPending.filter(p=>!paid.includes(p.id)).length} partenaires`, icon:'clock' },
    { label:'Versé en 2026', value:euro(totalVerse), sub:'depuis janvier', icon:'check' },
    { label:'Prochain run', value:'5 juin', sub:'virement SEPA', icon:'calendar' },
    { label:'Taux moyen', value:'7,7 %', sub:'commission réseau', icon:'euroCircle' },
  ];

  return (
    <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr 1fr':'repeat(4,1fr)', gap: mobile?12:18 }}>
        {metrics.map((m,i)=><KPICard key={i} {...m} delay={i*50} />)}
      </div>
      <div className="card" style={{ overflow:'hidden' }}>
        <div style={{ padding:'18px 20px', borderBottom:'1px solid var(--border)', display:'flex', justifyContent:'space-between', alignItems:'center', gap:12, flexWrap:'wrap' }}>
          <div><span className="section-title" style={{ fontSize:16 }}>Lot en préparation — 5 juin 2026</span>
            <div style={{ fontSize:13, color:'var(--muted)', marginTop:3 }}>Validez les commissions arrivées à échéance.</div></div>
          <button className="btn btn-primary btn-sm" style={{ height:40 }} disabled={remaining===0} onClick={validateAll}>
            <Icon name="check" size={16} />Tout valider · {euro(remaining)}</button>
        </div>
        {mobile ? (
          <div>
            {withPending.map(p=>{
              const done = paid.includes(p.id);
              return (
                <div key={p.id} style={{ padding:'14px 16px', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', gap:12, opacity: done?.55:1 }}>
                  <Avatar initials={p.initials} size={36} color="var(--navy)" />
                  <div style={{ flex:1, minWidth:0 }}>
                    <div className="cell-client" style={{ whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{p.company}</div>
                    <div style={{ display:'flex', alignItems:'center', gap:8, marginTop:5 }}><TierPill tier={p.tier} small /><span className="tnum" style={{ fontSize:13, fontWeight:700, color:'var(--ink)' }}>{euro(p.pending)}</span></div>
                  </div>
                  {done
                    ? <span className="badge b-effectue"><Icon name="check" size={12} stroke={2.4} />Versé</span>
                    : <button className="btn btn-ghost btn-sm" style={{ height:34 }} onClick={()=>validate(p)}>Valider</button>}
                </div>
              );
            })}
          </div>
        ) : (
        <div style={{ padding:'8px 4px', overflowX:'auto' }}>
          <table className="tbl">
            <thead><tr><th>Partenaire</th><th>Niveau</th><th>IBAN</th><th style={{textAlign:'right'}}>Montant</th><th style={{textAlign:'right'}}>Action</th></tr></thead>
            <tbody>
              {withPending.map(p=>{
                const done = paid.includes(p.id);
                return (
                  <tr key={p.id} style={{ opacity: done?.55:1 }}>
                    <td><div style={{ display:'flex', alignItems:'center', gap:11 }}><Avatar initials={p.initials} size={30} color="var(--navy)" /><span className="cell-client">{p.company}</span></div></td>
                    <td><TierPill tier={p.tier} small /></td>
                    <td className="mono" style={{ fontSize:12, color:'var(--muted)' }}>FR76 ···· {p.id.replace('P-','')}{p.id.replace('P-','')}{p.id.replace('P-','')}</td>
                    <td className="tnum" style={{ textAlign:'right', fontWeight:700, color:'var(--ink)' }}>{euro(p.pending)}</td>
                    <td style={{ textAlign:'right' }}>
                      {done
                        ? <span className="badge b-effectue"><Icon name="check" size={12} stroke={2.4} />Versé</span>
                        : <button className="btn btn-ghost btn-sm" style={{ height:32 }} onClick={()=>validate(p)}>Valider</button>}
                    </td>
                  </tr>
                );
              })}
            </tbody>
          </table>
        </div>
        )}
      </div>
    </div>
  );
}

/* ============== CLIENTS ============== */
function BoxBadge({ tier }) {
  if (!tier) return <span style={{ color:'var(--faint)' }}>—</span>;
  return <span style={{ display:'inline-flex', alignItems:'center', gap:5, fontSize:12, fontWeight:600, padding:'2px 9px', borderRadius:999, background:'var(--cream)', color:'var(--navy)', border:'1px solid var(--cream-dim)' }}><Icon name="package" size={12} />Box {tier}</span>;
}
function AdminClients({ mobile, go }) {
  const C = window.LBC_ADMIN, a = C.clientsAgg();
  const [q, setQ] = useAd('');
  const kpis = [
    { label:'Clients', value:a.count, sub:'déménagements confirmés', icon:'user' },
    { label:'Volume total', value:euro(a.volume), sub:'valeur cumulée', icon:'package' },
    { label:'Panier moyen', value:euro(a.avg), icon:'euroCircle' },
    { label:'Avec stockage', value:a.withStorage, sub:'clients équipés d\'un box', icon:'layers' },
  ];
  const rows = C.ADMIN_CLIENTS.filter(c=>`${c.name} ${c.partner} ${c.from} ${c.to}`.toLowerCase().includes(q.toLowerCase()));
  return (
    <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr 1fr':'repeat(4,1fr)', gap: mobile?12:18 }}>
        {kpis.map((k,i)=><KPICard key={i} {...k} delay={i*50} />)}
      </div>
      <div className="card" style={{ overflow:'hidden' }}>
        <div style={{ padding:'14px 20px', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-between', gap:12, flexWrap:'wrap' }}>
          <span className="section-title" style={{ fontSize:16 }}>Tous les clients · {rows.length}</span>
          <div className="input-wrap"><span className="lead-icon"><Icon name="search" size={16} /></span>
            <input className="input has-icon" value={q} onChange={e=>setQ(e.target.value)} placeholder="Client, partenaire, ville…" style={{ height:38, width: mobile?'100%':260 }} /></div>
        </div>
        {mobile ? (
          <div>
            {rows.map(c=>(
              <div key={c.id} onClick={()=>go('client-detail',{id:c.id})} style={{ padding:'14px 16px', borderBottom:'1px solid var(--border)', display:'flex', flexDirection:'column', gap:8, cursor:'pointer' }}>
                <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', gap:10 }}>
                  <span style={{ fontWeight:600, fontSize:14.5, color:'var(--ink)' }}>{c.name}</span>
                  <StatusBadge status={c.id==='C-2420'?window.LBC_LINK.status:c.status} />
                </div>
                <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', fontSize:12.5, color:'var(--muted)' }}>
                  <Route from={c.from} to={c.to} /><span className="tnum" style={{ fontWeight:600, color:'var(--ink)' }}>{euro(c.value)}</span>
                </div>
                <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center' }}>
                  <span style={{ fontSize:12, color:'var(--faint)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{c.partner}</span>
                  <BoxBadge tier={c.storage} />
                </div>
              </div>
            ))}
          </div>
        ) : (
          <div style={{ padding:'8px 4px', overflowX:'auto' }}>
            <table className="tbl">
              <thead><tr><th>Client</th><th>Trajet</th><th>Partenaire</th><th>Formule</th><th>Valeur</th><th>Statut</th><th>Stockage</th></tr></thead>
              <tbody>
                {rows.map(c=>(
                  <tr key={c.id} onClick={()=>go('client-detail',{id:c.id})}>
                    <td className="cell-client">{c.name}</td>
                    <td><Route from={c.from} to={c.to} /></td>
                    <td style={{ color:'var(--ink-2)' }}>{c.partner}</td>
                    <td><FormuleBadge formule={c.formule} /></td>
                    <td className="tnum" style={{ fontWeight:600, color:'var(--ink)' }}>{euro(c.value)}</td>
                    <td><StatusBadge status={c.id==='C-2420'?window.LBC_LINK.status:c.status} /></td>
                    <td><BoxBadge tier={c.storage} /></td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        )}
      </div>
    </div>
  );
}

/* ============== STOCKAGE ============== */
function AdminStorage({ mobile, showToast }) {
  const db = window.LBC_INT.useStore();
  const C = window.LBC_ADMIN, INT = window.LBC_INT;
  const TIERS = ['S','M','L','XL'];
  const [q, setQ] = useAd('');
  const all = (db.boxes || []);
  const demandes = all.filter(b=>b.statut==='demande');
  const actifs   = all.filter(b=>b.statut==='actif');
  const actifsF  = actifs.filter(b=>`${b.client} Box ${b.tier}`.toLowerCase().includes(q.toLowerCase()));
  const initialsOf = (n)=> (n||'?').split(' ').filter(Boolean).map(w=>w[0]||'').join('').slice(0,2).toUpperCase() || '?';
  const fmtD = (d)=>{ try{ return d? new Date(d+'T00:00:00').toLocaleDateString('fr-FR',{day:'numeric',month:'short',year:'numeric'}) : 'à définir'; }catch(e){ return d||'à définir'; } };
  const dureeOf = (b)=> b.libre ? 'durée indéterminée' : ((b.months||'?')+' mois');
  const periode = (b)=> 'dès le '+fmtD(b.startDate)+' · '+dureeOf(b);
  const mrr = actifs.reduce((s,b)=>s+(Number(b.price)||0),0);
  const avg = actifs.length?Math.round(mrr/actifs.length):0;
  const bySize = TIERS.map(k=>({ key:k, n: actifs.filter(b=>b.tier===k).length }));
  const maxN = Math.max(...bySize.map(x=>x.n), 1);
  const tierColor = { S:'#8A96A0', M:'#2A6FDB', L:'#C77A0A', XL:'#B63D24' };
  const kpis = [
    { label:'Box actifs', value:actifs.length, sub:'en stockage', icon:'package' },
    { label:'Revenu mensuel', value:euro(mrr), sub:'loyers récurrents', icon:'euroCircle' },
    { label:'Demandes en attente', value:demandes.length, sub:'à confirmer', icon:'clock', accent: demandes.length?'#C77A0A':null },
    { label:'Loyer moyen', value:euro(avg), sub:'par box actif', icon:'euro' },
  ];
  const confirmer = (b)=>{ INT.setBoxStatut(b.id,'actif'); showToast&&showToast('Réservation confirmée — Box '+b.tier+' pour '+b.client); };
  const refuser   = (b)=>{ if(window.confirm('Refuser la demande de '+b.client+' (Box '+b.tier+') ?')){ INT.removeBox(b.id); showToast&&showToast('Demande refusée'); } };
  const cloturer  = (b)=>{ if(window.confirm('Clôturer le box de '+b.client+' ?')){ INT.setBoxStatut(b.id,'termine'); showToast&&showToast('Box clôturé'); } };

  return (
    <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr 1fr':'repeat(4,1fr)', gap: mobile?12:18 }}>
        {kpis.map((k,i)=><KPICard key={i} {...k} delay={i*50} />)}
      </div>

      {/* DEMANDES À CONFIRMER */}
      {demandes.length>0 && (
        <div className="card" style={{ overflow:'hidden', border:'1px solid #E9C893' }}>
          <div style={{ padding:'14px 20px', borderBottom:'1px solid var(--border)', background:'rgba(199,122,10,.07)', display:'flex', alignItems:'center', gap:9 }}>
            <Icon name="clock" size={17} style={{ color:'#C77A0A' }} />
            <span className="section-title" style={{ fontSize:15.5 }}>Demandes de réservation à confirmer</span>
            <span style={{ fontSize:12, fontWeight:700, color:'#fff', background:'#C77A0A', padding:'2px 9px', borderRadius:999 }}>{demandes.length}</span>
          </div>
          {demandes.map(b=>(
            <div key={b.id} style={{ display:'flex', alignItems:'center', gap:12, padding:'14px 20px', borderBottom:'1px solid var(--border)', flexWrap:'wrap' }}>
              <Avatar initials={initialsOf(b.client)} size={38} color="var(--navy)" />
              <div style={{ flex:1, minWidth:160 }}>
                <div style={{ fontSize:14.5, fontWeight:600, color:'var(--ink)' }}>{b.client}</div>
                <div style={{ fontSize:12.5, color:'var(--muted)', marginTop:2 }}>Box {b.tier} · {b.size} · <b style={{ color:'var(--ink-2)' }}>{euro(b.price)}/mois</b></div>
                <div style={{ fontSize:12, color:'var(--muted)', marginTop:1 }}>{periode(b)}</div>
              </div>
              <div style={{ display:'flex', gap:8 }}>
                <button className="btn btn-ghost btn-sm" style={{ height:36, color:'var(--perdu)' }} onClick={()=>refuser(b)}>Refuser</button>
                <button className="btn btn-primary btn-sm" style={{ height:36 }} onClick={()=>confirmer(b)}><Icon name="check" size={15} />Confirmer</button>
              </div>
            </div>
          ))}
        </div>
      )}

      {/* RÉPARTITION (box actifs) */}
      <div className="card card-pad">
        <span className="section-title" style={{ fontSize:16, display:'block', marginBottom:4 }}>Répartition des box actifs</span>
        <p style={{ fontSize:12.5, color:'var(--muted)', margin:'0 0 16px' }}>Tarifs indicatifs par taille.</p>
        <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr 1fr':'repeat(4,1fr)', gap:14 }}>
          {bySize.map(x=>(
            <div key={x.key} style={{ background:'var(--bg)', borderRadius:12, padding:'14px 16px' }}>
              <div style={{ display:'flex', justifyContent:'space-between', alignItems:'baseline' }}>
                <span className="serif" style={{ fontSize:20, fontWeight:700, color:'var(--navy)' }}>Box {x.key}</span>
                <span className="tnum" style={{ fontSize:18, fontWeight:700, color:'var(--ink)' }}>{x.n}</span>
              </div>
              <div style={{ marginTop:10, height:6, background:'rgba(20,56,78,.08)', borderRadius:999, overflow:'hidden' }}>
                <div style={{ width:`${(x.n/maxN)*100}%`, height:'100%', background:tierColor[x.key], borderRadius:999 }} />
              </div>
              <div style={{ fontSize:11.5, color:'var(--muted)', marginTop:7 }}>{C.BOX_SIZE[x.key]} · {euro(C.BOX_PRICE[x.key])}/m</div>
            </div>
          ))}
        </div>
      </div>

      {/* BOX ACTIFS */}
      <div className="card" style={{ overflow:'hidden' }}>
        <div style={{ padding:'14px 20px', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-between', gap:12, flexWrap:'wrap' }}>
          <span className="section-title" style={{ fontSize:16 }}>Box actifs · {actifs.length}</span>
          <div className="input-wrap"><span className="lead-icon"><Icon name="search" size={16} /></span>
            <input className="input has-icon" value={q} onChange={e=>setQ(e.target.value)} placeholder="Client ou taille de box…" style={{ height:38, width: mobile?'100%':240 }} /></div>
        </div>
        {actifs.length===0 ? (
          <div style={{ padding:'34px 20px', textAlign:'center', color:'var(--muted)', fontSize:13.5 }}>Aucun box actif pour l'instant.{demandes.length>0?' Confirmez une demande ci-dessus pour l\'activer.':' Les réservations clients arrivent en « Demandes à confirmer ».'}</div>
        ) : (<>
          <div style={{ padding:'10px 20px', background:'rgba(37,99,235,.06)', borderBottom:'1px solid var(--border)', fontSize:12.5, color:'var(--ink-2)' }}>💳 Les loyers sont facturés <b>automatiquement chaque mois</b> à la date de réservation, sans action de ta part. <span style={{ color:'var(--muted)' }}>Le rapprochement automatique avec tes virements bancaires arrivera ensuite.</span></div>
        {mobile ? (
          <div>
            {actifsF.map(b=>(
              <div key={b.id} style={{ padding:'14px 16px', borderBottom:'1px solid var(--border)' }}>
                <div style={{ display:'flex', alignItems:'center', gap:12 }}>
                  <Avatar initials={initialsOf(b.client)} size={36} color="var(--navy)" />
                  <div style={{ flex:1, minWidth:0 }}>
                    <div style={{ fontWeight:600, fontSize:14, color:'var(--ink)' }}>{b.client}</div>
                    <div style={{ fontSize:12, color:'var(--muted)', marginTop:3 }}>Box {b.tier} · {b.size}</div>
                    <div style={{ fontSize:12, color:'var(--muted)' }}>{periode(b)}</div>
                    <div style={{ fontSize:12, color:'var(--ink-2)', marginTop:1 }}>🔁 Prochain loyer : {fmtD(INT.boxNextBill(b))}</div>
                  </div>
                  <div className="tnum" style={{ fontWeight:700, fontSize:14, color:'var(--ink)' }}>{euro(b.price)}<span style={{ fontSize:11, fontWeight:500, color:'var(--muted)' }}>/m</span></div>
                </div>
                <div style={{ display:'flex', gap:8, marginTop:10 }}>
                  <button className="btn btn-ghost btn-sm" style={{ flex:1 }} onClick={()=>cloturer(b)}>Clôturer</button>
                  <button className="btn btn-ghost btn-sm" style={{ flex:1 }} onClick={()=>showToast&&showToast('Reçu de loyer envoyé à '+b.client)}><Icon name="receipt" size={14} />Reçu</button>
                </div>
              </div>
            ))}
          </div>
        ) : (
          <div style={{ padding:'8px 4px', overflowX:'auto' }}>
            <table className="tbl">
              <thead><tr><th>Client</th><th>Box</th><th>Période</th><th>Loyer / mois</th><th>Prochain loyer</th><th style={{ textAlign:'right' }}>Actions</th></tr></thead>
              <tbody>
                {actifsF.map(b=>(
                  <tr key={b.id}>
                    <td><div style={{ display:'flex', alignItems:'center', gap:11 }}><Avatar initials={initialsOf(b.client)} size={30} color="var(--navy)" /><span className="cell-client">{b.client}</span></div></td>
                    <td><BoxBadge tier={b.tier} /> <span style={{ fontSize:12, color:'var(--muted)' }}>{b.size}</span></td>
                    <td style={{ color:'var(--muted)', fontSize:12.5 }}>{periode(b)}</td>
                    <td className="tnum" style={{ fontWeight:600, color:'var(--ink)' }}>{euro(b.price)}<span style={{ fontSize:11, fontWeight:500, color:'var(--muted)' }}>/m</span></td>
                    <td style={{ color:'var(--ink-2)', fontSize:12.5 }}>🔁 {fmtD(INT.boxNextBill(b))}</td>
                    <td style={{ textAlign:'right', whiteSpace:'nowrap' }}>
                      <button className="btn btn-ghost btn-sm" style={{ height:32, marginRight:6 }} onClick={()=>cloturer(b)}>Clôturer</button>
                      <button className="btn btn-ghost btn-sm" style={{ height:32 }} onClick={()=>showToast&&showToast('Reçu de loyer envoyé à '+b.client)}><Icon name="receipt" size={14} />Reçu</button>
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        )}
        </>)}
      </div>
    </div>
  );
}

/* ============== DETAIL PAGES ============== */
function DetailBack({ go, to, parent, label }) {
  return (
    <div style={{ display:'flex', alignItems:'center', gap:8, fontSize:13.5, marginBottom:16 }}>
      <a onClick={()=>go(to)} style={{ color:'var(--muted)', cursor:'pointer', fontWeight:500 }}>{parent}</a>
      <Icon name="chevronR" size={14} style={{ color:'var(--faint)' }} />
      <span style={{ color:'var(--ink)', fontWeight:600 }}>{label}</span>
    </div>
  );
}

function AdminPartnerDetail({ id, go, mobile }) {
  const A = window.LBC_ADMIN, p = A.PARTNERS.find(x=>x.id===id) || A.PARTNERS[0];
  const leads = A.NET_LEADS.filter(l=>l.partner===p.company);
  const kpis = [
    { label:'Leads', value:p.leads, icon:'inbox' },
    { label:'Volume généré', value:euro(p.volume), icon:'package' },
    { label:'Versé', value:euro(p.verse), icon:'check' },
    { label:'À verser', value:euro(p.pending), icon:'clock' },
  ];
  return (
    <div>
      <DetailBack go={go} to="partners" parent="Partenaires" label={p.company} />
      <div className="card card-pad" style={{ display:'flex', alignItems:'center', gap:16, marginBottom:18, flexWrap:'wrap' }}>
        <Avatar initials={p.initials} size={54} color="var(--navy)" />
        <div style={{ flex:1, minWidth:160 }}>
          <div style={{ display:'flex', alignItems:'center', gap:10, flexWrap:'wrap' }}><span style={{ fontSize:18, fontWeight:600, color:'var(--ink)' }}>{p.company}</span><TierPill tier={p.tier} /></div>
          <div style={{ fontSize:13.5, color:'var(--muted)', marginTop:3 }}>{p.contact} · {p.type} · {p.city} · partenaire depuis {p.since}</div>
        </div>
        <div style={{ textAlign:'right' }}><div className="card-label">Taux</div><div style={{ fontSize:20, fontWeight:700, color:'var(--brand)' }}>{A.RATE[p.tier]} %</div></div>
      </div>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr 1fr':'repeat(4,1fr)', gap: mobile?12:18, marginBottom:18 }}>
        {kpis.map((k,i)=><KPICard key={i} {...k} delay={i*50} />)}
      </div>
      <div className="card" style={{ overflow:'hidden' }}>
        <div style={{ padding:'16px 20px', borderBottom:'1px solid var(--border)' }}><span className="section-title" style={{ fontSize:16 }}>Leads de ce partenaire · {leads.length}</span></div>
        <div style={{ padding:'8px 4px', overflowX:'auto' }}>
          <table className="tbl">
            <thead><tr><th>Client</th><th>Trajet</th><th>Statut</th><th>Valeur</th><th style={{textAlign:'right'}}>Commission</th></tr></thead>
            <tbody>
              {leads.map(l=>(
                <tr key={l.id}>
                  <td className="cell-client">{l.client}</td>
                  <td><Route from={l.from} to={l.to} /></td>
                  <td><StatusBadge status={l.status} /></td>
                  <td className="tnum">{euro(l.value)}</td>
                  <td className="tnum" style={{ textAlign:'right', fontWeight:600, color:l.commission?'var(--ink)':'var(--faint)' }}>{l.commission?euro(l.commission):'—'}</td>
                </tr>
              ))}
              {leads.length===0 && <tr><td colSpan={5} style={{ textAlign:'center', color:'var(--muted)', padding:'24px' }}>Aucun lead récent.</td></tr>}
            </tbody>
          </table>
        </div>
      </div>
    </div>
  );
}

function AdminClientDetail({ id, go, mobile, showToast, boxApi, chatApi, notesApi }) {
  const [,force] = React.useState(0);
  const A = window.LBC_ADMIN, c = A.ADMIN_CLIENTS.find(x=>x.id===id) || A.ADMIN_CLIENTS[0];
  const link = c.id==='C-2420' ? window.LBC_LINK : null;
  const status = link ? link.status : c.status;
  const pay = link ? link.payment : c.pay;
  const virConfirmed = link ? link.virementConfirmed : true;
  const reserved = status!=='devis';
  const deposit = Math.round(c.value*0.3), solde = c.value-deposit;
  const Row = ({ k, v }) => (<div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', gap:12, padding:'11px 0', borderBottom:'1px solid var(--border)' }}><span style={{ fontSize:13.5, color:'var(--muted)' }}>{k}</span><span style={{ fontSize:13.5, fontWeight:600, color:'var(--ink)', textAlign:'right' }}>{v}</span></div>);
  const move = (
    <div className="card card-pad"><span className="section-title" style={{ fontSize:16 }}>Déménagement</span>
      <div style={{ marginTop:10 }}>
        <Row k="Trajet" v={<Route from={c.from} to={c.to} strong />} />
        <Row k="Formule" v={<FormuleBadge formule={c.formule} />} />
        <Row k="Date" v={c.date} />
        <Row k="Partenaire" v={c.partner} />
        <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', paddingTop:12 }}><span style={{ fontSize:13.5, color:'var(--muted)' }}>Valeur du devis</span><span className="tnum" style={{ fontSize:17, fontWeight:700, color:'var(--ink)' }}>{euro(c.value)}</span></div>
      </div>
    </div>
  );
  const payment = (
    <div className="card card-pad"><span className="section-title" style={{ fontSize:16 }}>Paiement</span>
      <div style={{ marginTop:10 }}>
        <Row k={'Acompte (30 %)'} v={<span className="tnum">{euro(deposit)}</span>} />
        <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', padding:'11px 0', borderBottom:'1px solid var(--border)' }}>
          <span style={{ fontSize:13.5, color:'var(--muted)' }}>Statut acompte</span>
          {!reserved ? <span className="badge b-recu">En attente d'acceptation</span>
            : pay==='carte' ? <span className="badge b-effectue"><Icon name="check" size={12} stroke={2.4} />Réglé par carte</span>
            : virConfirmed ? <span className="badge b-effectue"><Icon name="check" size={12} stroke={2.4} />Virement reçu</span>
            : <span className="badge b-accepte">Virement en attente</span>}
        </div>
        {reserved && pay==='virement' && !virConfirmed && (
          <button className="btn btn-primary btn-sm" style={{ width:'100%', height:40, margin:'10px 0 4px' }} onClick={()=>{ window.LBC_LINK={...window.LBC_LINK, virementConfirmed:true}; showToast&&showToast('Virement marqué comme reçu — réservation confirmée'); force(x=>x+1); }}>
            <Icon name="check" size={15} />Marquer le virement reçu</button>
        )}
        <Row k="Solde (jour J)" v={<span className="tnum">{link&&link.soldePaid?<span style={{color:'var(--effectue)'}}>Réglé · {euro(solde)}</span>:euro(solde)}</span>} />
      </div>
    </div>
  );
  const storage = (
    <div className="card card-pad"><span className="section-title" style={{ fontSize:16 }}>Stockage</span>
      {c.storage ? (
        <div style={{ marginTop:10 }}>
          <Row k="Box" v={<BoxBadge tier={c.storage} />} />
          <Row k="Taille" v={A.BOX_SIZE[c.storage]} />
          <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', paddingTop:12 }}><span style={{ fontSize:13.5, color:'var(--muted)' }}>Loyer mensuel</span><span className="tnum" style={{ fontSize:16, fontWeight:700, color:'var(--brand)' }}>{euro(A.BOX_PRICE[c.storage])}</span></div>
        </div>
      ) : <p style={{ fontSize:13.5, color:'var(--muted)', margin:'10px 0 0' }}>Aucun box de stockage.</p>}
    </div>
  );
  return (
    <div>
      <DetailBack go={go} to="clients" parent="Clients" label={c.name} />
      <div className="card card-pad" style={{ display:'flex', alignItems:'center', gap:16, marginBottom:18, flexWrap:'wrap' }}>
        <Avatar initials={c.name.split(' ').map(x=>x[0]).join('')} size={52} color="var(--navy)" />
        <div style={{ flex:1, minWidth:160 }}>
          <div style={{ display:'flex', alignItems:'center', gap:10, flexWrap:'wrap' }}><span style={{ fontSize:18, fontWeight:600, color:'var(--ink)' }}>{c.name}</span><StatusBadge status={status} /></div>
          <div style={{ fontSize:13.5, color:'var(--muted)', marginTop:3, display:'flex', alignItems:'center', gap:8 }}><Route from={c.from} to={c.to} /> · recommandé par {c.partner}</div>
        </div>
      </div>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr':'1fr 1fr', gap:18, alignItems:'start' }}>
        <div style={{ display:'flex', flexDirection:'column', gap:18 }}>{move}{storage}</div>
        {payment}
      </div>
      {c.storage && <div style={{ marginTop:18 }}>
        {c.id==='C-2420' && boxApi
          ? <BoxOverview boxName={'Box '+c.storage} items={boxApi.items} capacity={{S:4,M:8,L:14,XL:20}[c.storage]} editable onAdd={boxApi.add} onRemove={boxApi.remove} onReorder={boxApi.reorder} showToast={showToast} />
          : <BoxOverview boxName={'Box '+c.storage} items={window.SEED_BOX} capacity={{S:4,M:8,L:14,XL:20}[c.storage]} editable={false} />}
      </div>}
      {(()=>{
        const acts = [
          { icon:'inbox', color:'var(--recu)', label:'Lead reçu de '+c.partner, time:'24 mai 2026, 11h47' },
          { icon:'fileText', color:'var(--blue)', label:'Devis envoyé · '+euro(c.value), time:'27 mai 2026' },
        ];
        if (reserved) acts.push({ icon:'check', color:'var(--effectue)', label: pay==='carte'?'Devis accepté · acompte payé par carte':'Devis accepté · virement '+(virConfirmed?'reçu':'en attente'), time:'31 mai 2026' });
        if (c.storage) acts.push({ icon:'package', color:'var(--accepte)', label:'Box '+c.storage+' attribué', time:c.date });
        if (link && link.soldePaid) acts.push({ icon:'euroCircle', color:'var(--verse)', label:'Solde réglé · déménagement effectué', time:c.date });
        return (
          <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr':'1fr 1fr', gap:18, marginTop:18, alignItems:'start' }}>
            <ActivityTimeline events={acts} />
            <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
              {notesApi && <InternalNotes notesApi={notesApi} showToast={showToast} />}
              {chatApi && c.id==='C-2420' && <ChatPanel as="staff" chatApi={chatApi} showToast={showToast} title={c.name} subtitle={c.from+' → '+c.to} avatar={c.name.split(' ').map(x=>x[0]).join('')} height={220} />}
            </div>
          </div>
        );
      })()}
    </div>
  );
}

/* ============== ADMIN SHELL ============== */
const ADMIN_NAV = [
  { key:'overview',     label:'Vue d\'ensemble', icon:'dashboard' },
  { key:'partners',     label:'Partenaires',     icon:'building' },
  { key:'net-leads',    label:'Leads réseau',    icon:'list' },
  { key:'payouts',      label:'Versements',      icon:'euro' },
];
const ADMIN_HEAD = {
  overview:  { title:'Vue d\'ensemble', sub:'L\'activité de votre réseau de partenaires en temps réel.' },
  partners:  { title:'Partenaires', sub:'Gérez votre réseau et les nouvelles candidatures.' },
  'net-leads':{ title:'Leads du réseau', sub:'Tous les leads soumis par vos partenaires.' },
  payouts:   { title:'Versements', sub:'Pilotez les commissions à reverser aux partenaires.' },
};

const ADMIN_MNAV = [
  { key:'overview',  label:'Réseau',      icon:'dashboard' },
  { key:'partners',  label:'Partenaires', icon:'building' },
  { key:'net-leads', label:'Leads',       icon:'list' },
  { key:'payouts',   label:'Versements',  icon:'euro' },
];

function AdminMobileShell({ screen, go, showToast, selId, retrievals, scheduleRetrieval, boxApi }) {
  const A = window.LBC_ADMIN;
  const head = ADMIN_HEAD[screen] || ADMIN_HEAD.overview;
  const pendCount = A.PENDING_PARTNERS.length;
  const isDetail = screen==='partner-detail' || screen==='client-detail';
  const Screen = { overview:AdminOverview, partners:AdminPartners, 'net-leads':AdminLeads, payouts:AdminPayouts, clients:AdminClients, storage:AdminStorage }[screen] || AdminOverview;
  return (
    <div style={{ height:'100%', display:'flex', flexDirection:'column', background:'var(--bg)' }}>
      <header style={{ flexShrink:0, background:'var(--navy-deep)', color:'var(--cream)', paddingTop:48, paddingBottom:12, paddingLeft:18, paddingRight:18, display:'flex', alignItems:'center', justifyContent:'space-between' }}>
        <div style={{ display:'flex', alignItems:'center', gap:9 }}>
          <Logo size={18} showSub={false} />
          <span style={{ fontSize:8.5, fontWeight:700, letterSpacing:'.1em', color:'var(--brand-bright)', border:'1px solid rgba(224,65,31,.5)', borderRadius:4, padding:'2px 5px' }}>BACK-OFFICE</span>
        </div>
        <Avatar initials={A.ADMIN_USER.initials} size={32} color="var(--brand)" />
      </header>
      <div className="scroll" style={{ flex:1, overflowY:'auto', padding:'20px 16px 26px' }} key={screen}>
        <div className="fade-in">
          {isDetail ? (
            screen==='partner-detail' ? <AdminPartnerDetail id={selId} go={go} mobile /> : <AdminClientDetail id={selId} go={go} mobile showToast={showToast} boxApi={boxApi} />
          ) : (<>
            <div style={{ marginBottom:16 }}>
              <h1 className="page-title" style={{ fontSize:21 }}>{head.title}</h1>
              <p style={{ fontSize:13.5, color:'var(--muted)', margin:'6px 0 0', lineHeight:1.5 }}>{head.sub}</p>
            </div>
            <Screen go={go} showToast={showToast} mobile retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} />
          </>)}
        </div>
      </div>
      <div style={{ flexShrink:0, background:'rgba(255,255,255,.95)', backdropFilter:'blur(10px)', borderTop:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-around', padding:'8px 6px 26px' }}>
        {ADMIN_MNAV.map(n=>{
          const active = screen===n.key || (n.key==='partners'&&screen==='partner-detail') || (n.key==='clients'&&screen==='client-detail');
          return (
            <button key={n.key} onClick={()=>go(n.key)} style={{ position:'relative', display:'flex', flexDirection:'column', alignItems:'center', gap:4, padding:'4px 12px', color: active?'var(--brand)':'var(--faint)', minWidth:58 }}>
              <Icon name={n.icon} size={21} stroke={active?2.2:1.8} />
              <span style={{ fontSize:10.5, fontWeight: active?600:500 }}>{n.label}</span>
              {n.key==='partners' && pendCount>0 && <span style={{ position:'absolute', top:0, right:8, width:7, height:7, borderRadius:'50%', background:'var(--brand-bright)' }} />}
            </button>
          );
        })}
      </div>
    </div>
  );
}

function AdminApp({ screen, go, showToast, mobile, selId, retrievals, scheduleRetrieval, boxApi }) {
  if (mobile) return <AdminMobileShell screen={screen} go={go} showToast={showToast} selId={selId} retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} boxApi={boxApi} />;
  const A = window.LBC_ADMIN;
  const head = ADMIN_HEAD[screen] || ADMIN_HEAD.overview;
  const pendCount = A.PENDING_PARTNERS.length;
  const isDetail = screen==='partner-detail' || screen==='client-detail';
  const Screen = { overview:AdminOverview, partners:AdminPartners, 'net-leads':AdminLeads, payouts:AdminPayouts, clients:AdminClients, storage:AdminStorage }[screen] || AdminOverview;

  return (
    <div style={{ display:'flex', height:'100%' }}>
      <aside style={{ width:248, flexShrink:0, background:'var(--navy-deep)', color:'var(--cream)', display:'flex', flexDirection:'column', height:'100%' }}>
        <div style={{ padding:'22px 22px 18px', borderBottom:'1px solid rgba(255,255,255,.07)', display:'flex', alignItems:'center', justifyContent:'space-between' }}>
          <Logo size={22} showSub={false} />
          <span style={{ fontSize:9.5, fontWeight:700, letterSpacing:'.12em', color:'var(--brand-bright)', border:'1px solid rgba(224,65,31,.5)', borderRadius:5, padding:'3px 6px' }}>BACK-OFFICE</span>
        </div>
        <nav style={{ flex:1, padding:'14px 12px', display:'flex', flexDirection:'column', gap:3 }}>
          {ADMIN_NAV.map(n=>{
            const active = screen===n.key || (n.key==='partners'&&screen==='partner-detail') || (n.key==='clients'&&screen==='client-detail');
            return (
              <button key={n.key} onClick={()=>go(n.key)} style={{ position:'relative', display:'flex', alignItems:'center', gap:12, padding:'10px 14px', borderRadius:9, fontSize:14, fontWeight:500, textAlign:'left', width:'100%',
                color: active?'var(--cream)':'rgba(245,239,227,.6)', background: active?'rgba(255,255,255,.08)':'transparent', transition:'.14s' }}
                onMouseEnter={e=>{ if(!active) e.currentTarget.style.background='rgba(255,255,255,.04)'; }}
                onMouseLeave={e=>{ if(!active) e.currentTarget.style.background='transparent'; }}>
                {active && <span style={{ position:'absolute', left:0, top:8, bottom:8, width:3, borderRadius:3, background:'var(--brand-bright)' }} />}
                <Icon name={n.icon} size={19} />{n.label}
                {n.key==='partners' && pendCount>0 && <span style={{ marginLeft:'auto', fontSize:11, fontWeight:700, background:'var(--brand)', color:'#fff', borderRadius:999, padding:'1px 7px' }}>{pendCount}</span>}
              </button>
            );
          })}
        </nav>
        <div style={{ padding:'14px 16px', borderTop:'1px solid rgba(255,255,255,.07)', display:'flex', alignItems:'center', gap:11 }}>
          <Avatar initials={A.ADMIN_USER.initials} size={38} color="var(--brand)" />
          <div style={{ minWidth:0, flex:1 }}>
            <div style={{ fontSize:13.5, fontWeight:600 }}>{A.ADMIN_USER.name}</div>
            <div style={{ fontSize:12, color:'rgba(245,239,227,.55)' }}>{A.ADMIN_USER.role}</div>
          </div>
        </div>
      </aside>
      <div style={{ flex:1, minWidth:0, display:'flex', flexDirection:'column' }}>
        <header style={{ height:64, flexShrink:0, background:'rgba(255,255,255,.86)', backdropFilter:'blur(8px)', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-between', padding:'0 28px' }}>
          <div><div style={{ fontSize:15, fontWeight:600, color:'var(--ink)' }}>LBC · Réseau partenaires</div>
            <div style={{ fontSize:12, color:'var(--muted)' }}>Back-office interne</div></div>
          <div style={{ display:'flex', alignItems:'center', gap:16 }}>
            <span style={{ display:'inline-flex', alignItems:'center', gap:7, fontSize:12.5, fontWeight:600, color:'var(--effectue)', background:'var(--effectue-bg)', padding:'5px 11px', borderRadius:999 }}>
              <span style={{ width:7, height:7, borderRadius:'50%', background:'var(--effectue)' }} />Réseau actif</span>
            <Avatar initials={A.ADMIN_USER.initials} size={34} color="var(--brand)" />
          </div>
        </header>
        <main className="scroll" style={{ flex:1, overflowY:'auto', padding:'28px 36px 60px' }}>
          <div style={{ maxWidth:1240, margin:'0 auto' }} key={screen}>
            <div className="fade-in">
              {isDetail ? (
                screen==='partner-detail' ? <AdminPartnerDetail id={selId} go={go} mobile={false} /> : <AdminClientDetail id={selId} go={go} mobile={false} showToast={showToast} boxApi={boxApi} />
              ) : (<>
                <div style={{ marginBottom:22 }}>
                  <h1 className="page-title">{head.title}</h1>
                  <p style={{ fontSize:14, color:'var(--muted)', margin:'7px 0 0' }}>{head.sub}</p>
                </div>
                <Screen go={go} showToast={showToast} mobile={false} retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} />
              </>)}
            </div>
          </div>
        </main>
      </div>
    </div>
  );
}

/* ============== ADMIN (gestion clients / stockage / finances) ============== */
function GestionDashboard({ go, mobile }) {
  const A = window.LBC_ADMIN, f = A.financeAgg(), sa = A.storageAgg();
  const kpis = [
    { label:'CA déménagements', value:euro(f.movesCA), sub:'cumul réseau 2026', icon:'package' },
    { label:'Revenu stockage', value:euro(f.storageMrr)+' /m', sub:`${sa.boxes} box · ${euro(f.storageAnnual)}/an`, icon:'euroCircle' },
    { label:'Commissions reversées', value:euro(f.commissions), sub:'aux partenaires', icon:'euro' },
    { label:'Clients', value:f.clients, sub:'déménagements confirmés', icon:'user' },
  ];
  const src = [ { label:'Déménagements', value:f.movesCA, color:'#B63D24' }, { label:'Stockage (annualisé)', value:f.storageAnnual, color:'#14384E' } ];
  return (
    <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr 1fr':'repeat(4,1fr)', gap: mobile?12:18 }}>
        {kpis.map((k,i)=><KPICard key={i} {...k} delay={i*55} />)}
      </div>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr':'1.5fr 1fr', gap:18 }}>
        <div className="card card-pad">
          <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', marginBottom:6 }}>
            <span className="section-title" style={{ fontSize:16 }}>Revenu mensuel</span><span style={{ fontSize:12.5, color:'var(--muted)' }}>6 derniers mois</span>
          </div>
          <AreaChart data={A.MONTHLY_REVENUE} color="var(--brand)" />
        </div>
        <div className="card card-pad">
          <span className="section-title" style={{ fontSize:16, display:'block', marginBottom:16 }}>Sources de revenu</span>
          <Donut segments={src} unit="€ / an" />
        </div>
      </div>
      <div style={{ display:'grid', gridTemplateColumns: mobile?'1fr':'1fr 1fr', gap:18 }}>
        <div onClick={()=>go('clients')} className="card card-pad" style={{ display:'flex', alignItems:'center', gap:14, cursor:'pointer' }}>
          <span style={{ width:42, height:42, borderRadius:11, background:'var(--bg)', color:'var(--navy)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}><Icon name="user" size={20} /></span>
          <div style={{ flex:1 }}><div style={{ fontSize:14, fontWeight:600, color:'var(--ink)' }}>Gérer les clients</div><div style={{ fontSize:12.5, color:'var(--muted)' }}>{f.clients} clients · {euro(f.clientsCA)} de devis</div></div>
          <Icon name="chevronR" size={17} style={{ color:'var(--faint)' }} />
        </div>
        <div onClick={()=>go('storage')} className="card card-pad" style={{ display:'flex', alignItems:'center', gap:14, cursor:'pointer' }}>
          <span style={{ width:42, height:42, borderRadius:11, background:'var(--cream)', color:'var(--navy)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}><Icon name="package" size={20} /></span>
          <div style={{ flex:1 }}><div style={{ fontSize:14, fontWeight:600, color:'var(--ink)' }}>Gérer le stockage</div><div style={{ fontSize:12.5, color:'var(--muted)' }}>{sa.boxes} box · {euro(sa.mrr)}/mois récurrents</div></div>
          <Icon name="chevronR" size={17} style={{ color:'var(--faint)' }} />
        </div>
      </div>
    </div>
  );
}

const GESTION_NAV = [
  { key:'dashboard', label:'Finances', icon:'euroCircle' },
  { key:'planning',  label:'Planning', icon:'calendar' },
  { key:'clients',   label:'Clients',  icon:'user' },
  { key:'storage',   label:'Stockage', icon:'package' },
  { key:'messages',  label:'Messages', icon:'mail' },
];
const GESTION_HEAD = {
  dashboard:{ title:'Vue financière', sub:'Déménagements et stockage consolidés.' },
  planning: { title:'Planning', sub:'Déménagements et récupérations de box à venir.' },
  clients:  { title:'Clients', sub:'Tous les clients et leurs statistiques.' },
  storage:  { title:'Stockage', sub:'Tous les box en cours et leur revenu.' },
  messages: { title:'Messagerie', sub:'Échangez avec vos clients en direct.' },
};
function gestionScreenFor(screen){ return { dashboard:GestionDashboard, planning:PlanningCalendar, clients:AdminClients, storage:AdminStorage, messages:AdminMessages }[screen] || GestionDashboard; }

function GestionMobileShell({ screen, go, showToast, selId, retrievals, scheduleRetrieval, boxApi, chatApi, notesApi }) {
  const head = GESTION_HEAD[screen] || GESTION_HEAD.dashboard;
  const isDetail = screen==='client-detail';
  const Screen = gestionScreenFor(screen);
  return (
    <div style={{ height:'100%', display:'flex', flexDirection:'column', background:'var(--bg)' }}>
      <header style={{ flexShrink:0, background:'var(--navy-deep)', color:'var(--cream)', paddingTop:48, paddingBottom:12, paddingLeft:18, paddingRight:18, display:'flex', alignItems:'center', justifyContent:'space-between' }}>
        <div style={{ display:'flex', alignItems:'center', gap:9 }}><Logo size={18} showSub={false} />
          <span style={{ fontSize:8.5, fontWeight:700, letterSpacing:'.1em', color:'#7FB0FF', border:'1px solid rgba(127,176,255,.5)', borderRadius:4, padding:'2px 5px' }}>ADMIN</span></div>
        <Avatar initials={window.LBC_ADMIN.ADMIN_USER.initials} size={32} color="var(--blue)" />
      </header>
      <div className="scroll" style={{ flex:1, overflowY:'auto', padding:'20px 16px 26px' }} key={screen}>
        <div className="fade-in">
          {isDetail ? <AdminClientDetail id={selId} go={go} mobile showToast={showToast} boxApi={boxApi} chatApi={chatApi} notesApi={notesApi} /> : (<>
            <div style={{ marginBottom:16 }}><h1 className="page-title" style={{ fontSize:21 }}>{head.title}</h1><p style={{ fontSize:13.5, color:'var(--muted)', margin:'6px 0 0' }}>{head.sub}</p></div>
            <Screen go={go} showToast={showToast} mobile retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} chatApi={chatApi} />
          </>)}
        </div>
      </div>
      <div style={{ flexShrink:0, background:'rgba(255,255,255,.95)', backdropFilter:'blur(10px)', borderTop:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-around', padding:'8px 6px 26px' }}>
        {GESTION_NAV.map(n=>{
          const active = screen===n.key || (n.key==='clients'&&screen==='client-detail');
          return <button key={n.key} onClick={()=>go(n.key)} style={{ display:'flex', flexDirection:'column', alignItems:'center', gap:4, padding:'4px 14px', color: active?'var(--brand)':'var(--faint)', minWidth:64 }}><Icon name={n.icon} size={21} stroke={active?2.2:1.8} /><span style={{ fontSize:10.5, fontWeight: active?600:500 }}>{n.label}</span></button>;
        })}
      </div>
    </div>
  );
}

function GestionApp({ screen, go, showToast, mobile, selId, retrievals, scheduleRetrieval, boxApi, chatApi, notesApi }) {
  if (mobile) return <GestionMobileShell screen={screen} go={go} showToast={showToast} selId={selId} retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} boxApi={boxApi} chatApi={chatApi} notesApi={notesApi} />;
  const A = window.LBC_ADMIN;
  const head = GESTION_HEAD[screen] || GESTION_HEAD.dashboard;
  const isDetail = screen==='client-detail';
  const Screen = gestionScreenFor(screen);
  return (
    <div style={{ display:'flex', height:'100%' }}>
      <aside style={{ width:248, flexShrink:0, background:'var(--navy-deep)', color:'var(--cream)', display:'flex', flexDirection:'column', height:'100%' }}>
        <div style={{ padding:'22px 22px 18px', borderBottom:'1px solid rgba(255,255,255,.07)', display:'flex', alignItems:'center', justifyContent:'space-between' }}>
          <Logo size={22} showSub={false} />
          <span style={{ fontSize:9.5, fontWeight:700, letterSpacing:'.12em', color:'#7FB0FF', border:'1px solid rgba(127,176,255,.5)', borderRadius:5, padding:'3px 6px' }}>ADMIN</span>
        </div>
        <nav style={{ flex:1, padding:'14px 12px', display:'flex', flexDirection:'column', gap:3 }}>
          {GESTION_NAV.map(n=>{
            const active = screen===n.key || (n.key==='clients'&&screen==='client-detail');
            return (
              <button key={n.key} onClick={()=>go(n.key)} style={{ position:'relative', display:'flex', alignItems:'center', gap:12, padding:'10px 14px', borderRadius:9, fontSize:14, fontWeight:500, textAlign:'left', width:'100%',
                color: active?'var(--cream)':'rgba(245,239,227,.6)', background: active?'rgba(255,255,255,.08)':'transparent', transition:'.14s' }}
                onMouseEnter={e=>{ if(!active) e.currentTarget.style.background='rgba(255,255,255,.04)'; }} onMouseLeave={e=>{ if(!active) e.currentTarget.style.background='transparent'; }}>
                {active && <span style={{ position:'absolute', left:0, top:8, bottom:8, width:3, borderRadius:3, background:'var(--brand-bright)' }} />}
                <Icon name={n.icon} size={19} />{n.label}
              </button>
            );
          })}
        </nav>
        <div style={{ padding:'14px 16px', borderTop:'1px solid rgba(255,255,255,.07)', display:'flex', alignItems:'center', gap:11 }}>
          <Avatar initials={A.ADMIN_USER.initials} size={38} color="var(--blue)" />
          <div style={{ minWidth:0, flex:1 }}><div style={{ fontSize:13.5, fontWeight:600 }}>{A.ADMIN_USER.name}</div><div style={{ fontSize:12, color:'rgba(245,239,227,.55)' }}>Administration LBC</div></div>
        </div>
      </aside>
      <div style={{ flex:1, minWidth:0, display:'flex', flexDirection:'column' }}>
        <header style={{ height:64, flexShrink:0, background:'rgba(255,255,255,.86)', backdropFilter:'blur(8px)', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-between', padding:'0 28px' }}>
          <div><div style={{ fontSize:15, fontWeight:600, color:'var(--ink)' }}>LBC · Administration</div><div style={{ fontSize:12, color:'var(--muted)' }}>Clients · Stockage · Finances</div></div>
          <Avatar initials={A.ADMIN_USER.initials} size={34} color="var(--blue)" />
        </header>
        <main className="scroll" style={{ flex:1, overflowY:'auto', padding:'28px 36px 60px' }}>
          <div style={{ maxWidth:1240, margin:'0 auto' }} key={screen}>
            <div className="fade-in">
              {isDetail ? <AdminClientDetail id={selId} go={go} mobile={false} showToast={showToast} boxApi={boxApi} chatApi={chatApi} notesApi={notesApi} /> : (<>
                <div style={{ marginBottom:22 }}><h1 className="page-title">{head.title}</h1><p style={{ fontSize:14, color:'var(--muted)', margin:'7px 0 0' }}>{head.sub}</p></div>
                <Screen go={go} showToast={showToast} mobile={false} retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} chatApi={chatApi} />
              </>)}
            </div>
          </div>
        </main>
      </div>
    </div>
  );
}

/* ============== ESPACE LBC — COCKPIT UNIFIÉ (Back-office + Admin fusionnés) ============== */
// --- Admin réseau d'origine (back-office partenaires) — conservé tel quel ---
const ORIG_LBC_NAV = [
  { group:'Pilotage', items:[
    { key:'overview',  label:"Vue d'ensemble", icon:'dashboard' },
    { key:'planning',  label:'Planning',       icon:'calendar' },
  ]},
  { group:'Réseau & clients', items:[
    { key:'net-leads', label:'Leads',       icon:'list' },
    { key:'clients',   label:'Clients',     icon:'user' },
    { key:'partners',  label:'Partenaires', icon:'building' },
    { key:'storage',   label:'Stockage',    icon:'package' },
    { key:'messages',  label:'Messages',    icon:'mail' },
  ]},
  { group:'Finances', items:[
    { key:'finances',  label:'Finances',   icon:'euroCircle' },
    { key:'payouts',   label:'Versements', icon:'euro' },
  ]},
];
const ORIG_LBC_HEAD = {
  overview:   { title:"Vue d'ensemble", sub:"L'activité de votre réseau de partenaires en temps réel." },
  planning:   { title:'Planning', sub:'Déménagements et récupérations de box à venir.' },
  'net-leads':{ title:'Leads du réseau', sub:'Tous les leads soumis par vos partenaires.' },
  clients:    { title:'Clients', sub:'Tous les clients et leurs statistiques.' },
  partners:   { title:'Partenaires', sub:'Gérez votre réseau et les nouvelles candidatures.' },
  storage:    { title:'Stockage', sub:'Tous les box en cours et leur revenu.' },
  messages:   { title:'Messagerie', sub:'Échangez avec vos clients en direct.' },
  finances:   { title:'Finances', sub:'Déménagements et stockage consolidés.' },
  payouts:    { title:'Versements', sub:'Pilotez les commissions à reverser aux partenaires.' },
};
const ORIG_SCREENS = {
  overview:AdminOverview, planning:PlanningCalendar,
  clients:AdminClients, partners:AdminPartners, storage:AdminStorage,
  messages:AdminMessages, finances:GestionDashboard, payouts:AdminPayouts,
};

// --- Cockpit UNIFIÉ : une entrée par concept (déménagement + réseau partenaires fusionnés, sans doublon) ---
const LBC_NAV = [
  { group:'Pilotage', items:[
    { key:'i_accueil',      label:'Accueil',           icon:'dashboard' },
    { key:'i_demenagements',label:'Déménagements',     icon:'truck' },
    { key:'i_calendrier',   label:'Calendrier',        icon:'calendar' },
    { key:'net-leads',      label:'Leads réseau',      icon:'list' },
    { key:'i_todo',         label:'To-do & Objectifs', icon:'check' },
    { key:'i_operationnel', label:'Opérationnel',      icon:'package' },
    { key:'i_statistiques', label:'Statistiques',      icon:'trendUp' },
  ]},
  { group:'Clients & réseau', items:[
    { key:'i_clients',      label:'Clients',           icon:'user' },
    { key:'i_partners',     label:'Partenaires',       icon:'building' },
    { key:'storage',        label:'Stockage',          icon:'package' },
  ]},
  { group:'Finances', items:[
    { key:'i_finances',     label:'Finances & Bilan',  icon:'euroCircle' },
    { key:'i_payouts',      label:'Versements',        icon:'euro' },
  ]},
  { group:'Administration', items:[
    { key:'i_documents',    label:'Documents',         icon:'fileText' },
    { key:'i_parametres',   label:'Paramètres',        icon:'settings' },
  ]},
];
const LBC_HEAD = Object.assign({}, ORIG_LBC_HEAD, window.LBC_INT ? window.LBC_INT.HEAD : {});
// Écrans réseau d'origine pour les concepts non dupliqués ; le reste (préfixe i_) vient de l'espace interne
function lbcScreenFor(screen){ return ORIG_SCREENS[screen] || (window.LBC_INT ? window.LBC_INT.screenFor(screen) : AdminOverview); }
const isGestionScreen = ()=> false;
const LBC_FLAT = LBC_NAV.flatMap(g=>g.items);
const LBC_MNAV = [
  { key:'i_accueil',      label:'Accueil',  icon:'dashboard' },
  { key:'i_demenagements',label:'Déménag.', icon:'truck' },
  { key:'i_clients',      label:'Clients',  icon:'user' },
  { key:'i_finances',     label:'Finances', icon:'euroCircle' },
];
const LBC_MORE = ['i_calendrier','net-leads','i_todo','i_partners','storage','i_payouts','i_statistiques','i_documents','i_parametres'];

function LBCDetail({ screen, selId, go, mobile, showToast, boxApi, chatApi, notesApi }){
  if (screen==='partner-detail') return <AdminPartnerDetail id={selId} go={go} mobile={mobile} />;
  return <AdminClientDetail id={selId} go={go} mobile={mobile} showToast={showToast} boxApi={boxApi} chatApi={chatApi} notesApi={notesApi} />;
}

function LBCMobileShell({ screen, go, showToast, selId, retrievals, scheduleRetrieval, boxApi, chatApi, notesApi }){
  const A = window.LBC_ADMIN;
  const [more, setMore] = useAd(false);
  const head = LBC_HEAD[screen];
  const pendCount = A.PENDING_PARTNERS.length;
  const isDetail = screen==='partner-detail' || screen==='client-detail';
  const Screen = lbcScreenFor(screen);
  const onMoreScreen = LBC_MORE.includes(screen);
  const openSection = (k)=>{ setMore(false); go(k); };
  return (
    <div style={{ height:'100%', display:'flex', flexDirection:'column', background:'var(--bg)' }}>
      <header style={{ flexShrink:0, background:'var(--navy-deep)', color:'var(--cream)', paddingTop:48, paddingBottom:12, paddingLeft:18, paddingRight:18, display:'flex', alignItems:'center', justifyContent:'space-between' }}>
        <div style={{ display:'flex', alignItems:'center', gap:9 }}>
          <Logo size={18} showSub={false} />
          <span style={{ fontSize:8.5, fontWeight:700, letterSpacing:'.1em', color:'var(--brand-bright)', border:'1px solid rgba(224,65,31,.5)', borderRadius:4, padding:'2px 5px' }}>ESPACE LBC</span>
        </div>
        <Avatar initials={A.ADMIN_USER.initials} size={32} color="var(--brand)" />
      </header>
      <div className="scroll" style={{ flex:1, overflowY:'auto', padding:'20px 16px 26px' }} key={screen}>
        <div className="fade-in">
          {isDetail ? <LBCDetail screen={screen} selId={selId} go={go} mobile showToast={showToast} boxApi={boxApi} chatApi={chatApi} notesApi={notesApi} /> : (<>
            {head && <div style={{ marginBottom:16 }}>
              <h1 className="page-title" style={{ fontSize:21 }}>{head.title}</h1>
              <p style={{ fontSize:13.5, color:'var(--muted)', margin:'6px 0 0', lineHeight:1.5 }}>{head.sub}</p>
            </div>}
            <Screen go={go} showToast={showToast} mobile retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} chatApi={chatApi} />
          </>)}
        </div>
      </div>
      {more && (
        <div onClick={()=>setMore(false)} style={{ position:'absolute', inset:0, zIndex:30, background:'rgba(11,31,43,.55)', display:'flex', alignItems:'flex-end' }}>
          <div onClick={e=>e.stopPropagation()} style={{ width:'100%', background:'var(--card)', borderTopLeftRadius:20, borderTopRightRadius:20, padding:'10px 14px 30px' }}>
            <div style={{ width:38, height:4, borderRadius:4, background:'var(--border)', margin:'6px auto 12px' }} />
            {LBC_MORE.map(k=>{
              const n = LBC_FLAT.find(x=>x.key===k);
              return (
                <button key={k} onClick={()=>openSection(k)} style={{ display:'flex', alignItems:'center', gap:13, width:'100%', textAlign:'left', padding:'13px 10px', borderRadius:11, color:'var(--ink)' }}>
                  <span style={{ width:38, height:38, borderRadius:10, background:'var(--bg)', color:'var(--navy)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}><Icon name={n.icon} size={19} /></span>
                  <span style={{ flex:1, fontSize:14.5, fontWeight:500 }}>{n.label}</span>
                  {k==='partners' && pendCount>0 && <span style={{ fontSize:11, fontWeight:700, background:'var(--brand)', color:'#fff', borderRadius:999, padding:'1px 7px' }}>{pendCount}</span>}
                  <Icon name="chevronR" size={16} style={{ color:'var(--faint)' }} />
                </button>
              );
            })}
          </div>
        </div>
      )}
      <div style={{ flexShrink:0, background:'rgba(255,255,255,.95)', backdropFilter:'blur(10px)', borderTop:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-around', padding:'8px 6px 26px' }}>
        {LBC_MNAV.map(n=>{
          const active = screen===n.key;
          return (
            <button key={n.key} onClick={()=>go(n.key)} style={{ display:'flex', flexDirection:'column', alignItems:'center', gap:4, padding:'4px 10px', color: active?'var(--brand)':'var(--faint)', minWidth:54 }}>
              <Icon name={n.icon} size={21} stroke={active?2.2:1.8} /><span style={{ fontSize:10.5, fontWeight: active?600:500 }}>{n.label}</span>
            </button>
          );
        })}
        <button onClick={()=>setMore(true)} style={{ position:'relative', display:'flex', flexDirection:'column', alignItems:'center', gap:4, padding:'4px 10px', color: (more||onMoreScreen)?'var(--brand)':'var(--faint)', minWidth:54 }}>
          <Icon name="menu" size={21} stroke={(more||onMoreScreen)?2.2:1.8} /><span style={{ fontSize:10.5, fontWeight:(more||onMoreScreen)?600:500 }}>Plus</span>
          {pendCount>0 && <span style={{ position:'absolute', top:2, right:10, width:7, height:7, borderRadius:'50%', background:'var(--brand-bright)' }} />}
        </button>
      </div>
    </div>
  );
}

function LBCApp({ screen, go, showToast, mobile, selId, retrievals, scheduleRetrieval, boxApi, chatApi, notesApi }){
  const db = window.LBC_INT.useStore();
  const [seenBump, setSeenBump] = useAd(0);
  const _today = new Date().toISOString().slice(0,10);
  // éléments « événementiels » par section -> badge = ceux pas encore vus
  const cats = {
    i_demenagements: (db.moves||[]).filter(m=>m.statut==='devis_a_envoyer').map(m=>m.id),
    'net-leads':     (db.moves||[]).filter(m=>m.partenaire && m.statut==='devis_a_envoyer').map(m=>m.id),
    storage:         (db.boxes||[]).filter(b=>b.statut==='demande').map(b=>b.id),
    i_todo:          (db.tasks||[]).filter(t=>!t.done && (t.quad==='now' || (t.due && t.due < _today))).map(t=>t.id),
  };
  const seen = lbcLoadSeen();
  const unseenCount = (key)=>{ const ids=cats[key]||[]; const s=seen[key]||{}; return ids.filter(id=>!s[id]).length; };
  const markSeen = (key)=>{ const ids=cats[key]; if(!ids) return; const snap={}; ids.forEach(id=>snap[id]=1); const s=lbcLoadSeen(); s[key]=snap; lbcSaveSeen(s); setSeenBump(x=>x+1); };
  const sig = Object.keys(cats).map(k=>k+':'+cats[k].length).join('|');
  useAdE(()=>{ markSeen(screen); }, [screen, sig]);
  if (mobile) return <LBCMobileShell screen={screen} go={go} showToast={showToast} selId={selId} retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} boxApi={boxApi} chatApi={chatApi} notesApi={notesApi} />;
  const A = window.LBC_ADMIN;
  const head = LBC_HEAD[screen];
  const badges = {
    i_demenagements: unseenCount('i_demenagements'),
    'net-leads': unseenCount('net-leads'),
    storage: unseenCount('storage'),
    i_todo: unseenCount('i_todo'),
    i_partners: db._partnersPending||0,
    i_operationnel: (window.LBC_INT&&window.LBC_INT.flotteAlertes?window.LBC_INT.flotteAlertes().length:0)+(window.LBC_INT&&window.LBC_INT.stockBas?window.LBC_INT.stockBas().length:0),
    i_finances: 0,
  };
  const isDetail = screen==='partner-detail' || screen==='client-detail';
  const Screen = lbcScreenFor(screen);
  return (
    <div style={{ display:'flex', height:'100%' }}>
      <aside style={{ width:248, flexShrink:0, background:'var(--navy-deep)', color:'var(--cream)', display:'flex', flexDirection:'column', height:'100%' }}>
        <div style={{ padding:'22px 22px 18px', borderBottom:'1px solid rgba(255,255,255,.07)', display:'flex', alignItems:'center', justifyContent:'space-between' }}>
          <Logo size={22} showSub={false} />
          <span style={{ fontSize:9.5, fontWeight:700, letterSpacing:'.12em', color:'var(--brand-bright)', border:'1px solid rgba(224,65,31,.5)', borderRadius:5, padding:'3px 6px' }}>ESPACE LBC</span>
        </div>
        <nav className="scroll" style={{ flex:1, padding:'10px 12px', display:'flex', flexDirection:'column', gap:2, overflowY:'auto' }}>
          {LBC_NAV.map(grp=>(
            <div key={grp.group} style={{ marginBottom:4 }}>
              <div style={{ fontSize:10, fontWeight:700, letterSpacing:'.08em', textTransform:'uppercase', color:'rgba(245,239,227,.34)', padding:'12px 14px 6px' }}>{grp.group}</div>
              {grp.items.map(n=>{
                const active = screen===n.key || (n.key==='partners'&&screen==='partner-detail') || (n.key==='clients'&&screen==='client-detail');
                return (
                  <button key={n.key} onClick={()=>go(n.key)} style={{ position:'relative', display:'flex', alignItems:'center', gap:12, padding:'9px 14px', borderRadius:9, fontSize:14, fontWeight:500, textAlign:'left', width:'100%',
                    color: active?'var(--cream)':'rgba(245,239,227,.6)', background: active?'rgba(255,255,255,.08)':'transparent', transition:'.14s' }}
                    onMouseEnter={e=>{ if(!active) e.currentTarget.style.background='rgba(255,255,255,.04)'; }}
                    onMouseLeave={e=>{ if(!active) e.currentTarget.style.background='transparent'; }}>
                    {active && <span style={{ position:'absolute', left:0, top:7, bottom:7, width:3, borderRadius:3, background:'var(--brand-bright)' }} />}
                    <Icon name={n.icon} size={19} />{n.label}
                    {badges[n.key]>0 && <span style={{ marginLeft:'auto', fontSize:11, fontWeight:800, background:'var(--brand-bright)', color:'#fff', borderRadius:999, minWidth:18, textAlign:'center', padding:'1px 6px', boxShadow:'0 0 0 2px rgba(224,65,31,.25)' }}>{badges[n.key]}</span>}
                  </button>
                );
              })}
            </div>
          ))}
        </nav>
        <div style={{ padding:'14px 16px', borderTop:'1px solid rgba(255,255,255,.07)', display:'flex', alignItems:'center', gap:11 }}>
          {(()=>{ const owner=((db.settings&&db.settings.ownerName)||'').trim(); const name=owner||A.ADMIN_USER.name; const ini=owner?owner.split(' ').filter(Boolean).map(w=>w[0]).join('').slice(0,2).toUpperCase():A.ADMIN_USER.initials; return (<>
            <Avatar initials={ini} size={38} color="var(--brand)" />
            <div style={{ minWidth:0, flex:1 }}>
              <div style={{ fontSize:13.5, fontWeight:600 }}>{name}</div>
              <div style={{ fontSize:12, color:'rgba(245,239,227,.55)' }}>Espace interne LBC</div>
            </div></>); })()}
        </div>
      </aside>
      <div style={{ flex:1, minWidth:0, display:'flex', flexDirection:'column' }}>
        <header style={{ height:64, flexShrink:0, background:'rgba(255,255,255,.86)', backdropFilter:'blur(8px)', borderBottom:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'space-between', padding:'0 28px' }}>
          <div><div style={{ fontSize:15, fontWeight:600, color:'var(--ink)' }}>LBC · Espace interne</div>
            <div style={{ fontSize:12, color:'var(--muted)' }}>Réseau · Clients · Stockage · Finances</div></div>
          <div style={{ display:'flex', alignItems:'center', gap:16 }}>
            <span style={{ display:'inline-flex', alignItems:'center', gap:7, fontSize:12.5, fontWeight:600, color:'var(--effectue)', background:'var(--effectue-bg)', padding:'5px 11px', borderRadius:999 }}>
              <span style={{ width:7, height:7, borderRadius:'50%', background:'var(--effectue)' }} />Activité en cours</span>
            <Avatar initials={A.ADMIN_USER.initials} size={34} color="var(--brand)" />
          </div>
        </header>
        <main className="scroll" style={{ flex:1, overflowY:'auto', padding:'28px 36px 60px' }}>
          <div style={{ maxWidth:1240, margin:'0 auto' }} key={screen}>
            <div className="fade-in">
              {isDetail ? <LBCDetail screen={screen} selId={selId} go={go} mobile={false} showToast={showToast} boxApi={boxApi} chatApi={chatApi} notesApi={notesApi} /> : (<>
                {head && <div style={{ marginBottom:22 }}>
                  <h1 className="page-title">{head.title}</h1>
                  <p style={{ fontSize:14, color:'var(--muted)', margin:'7px 0 0' }}>{head.sub}</p>
                </div>}
                <Screen go={go} showToast={showToast} mobile={false} retrievals={retrievals} scheduleRetrieval={scheduleRetrieval} chatApi={chatApi} />
              </>)}
            </div>
          </div>
        </main>
      </div>
    </div>
  );
}

Object.assign(window, { AdminApp, GestionApp, LBCApp });
