/* Console interne — Partenaires : liste, ajout (assistant 4 étapes), fiche à onglets (design dev-admin2.jsx). */
const GRADES = [['silver','Silver'],['gold','Gold'],['diamond','Diamond']];
const GRADE_L = Object.fromEntries(GRADES);
const SECTEURS = [['banque','Banque'],['fintech','Fintech'],['agregateur','Agrégateur'],['assurance','Assurance'],['telecom','Télécom'],['autre','Autre']];
const SECTEUR_L = Object.fromEntries(SECTEURS);
const PAYS = ['Sénégal','Côte d\'Ivoire','Mali','Burkina Faso','Guinée'];
const MV_T = {debit:['Débit','mute'], recharge:['Recharge','ok'], remboursement:['Remboursement','info'], ajustement:['Ajustement','warn']};
const ROLES_M = {proprietaire:'Propriétaire', developpeur:'Développeur', finance:'Finance', lecteur:'Lecteur'};

function A2Partners(){
  const [f, setF] = React.useState(0);
  const [q, setQ] = React.useState(() => { try { const v = sessionStorage.getItem('lms_admin_q') || ''; sessionStorage.removeItem('lms_admin_q'); return v; } catch(e){ return ''; } });
  const [qa, setQa] = React.useState(q);
  React.useEffect(() => { const t = setTimeout(() => setQa(q), 300); return () => clearTimeout(t); }, [q]);
  const filtre = ['tous','production','sandbox','suspendus'][f];
  const [d, recharger, etat] = useDonnees(() => api('GET', `partenaires?filtre=${filtre}&q=${encodeURIComponent(qa)}`), [filtre, qa]);
  return <Page max={1280}><PageHead title="Partenaires" sub="Comptes partenaires : créés par l'équipe, ou par inscription publique si elle est ouverte." actions={<Btn icon="plus" onClick={()=>aller('newp')}>Ajouter un partenaire</Btn>}/>
    <div style={{display:'flex', gap:8, flexWrap:'wrap'}}><div style={{flex:'1 1 260px'}}><Inp value={q} onChange={e=>setQ(e.target.value)} placeholder="Nom, code, email…" lead={<I n="magnifying-glass" s={17}/>} style={{height:40}}/></div><Seg opts={['Tous','En production','En sandbox','Suspendus']} i={f} set={setF}/></div>
    {etat.erreur ? <Erreur e={etat.erreur} recharger={recharger}/> :
    <Tbl chargement={!d} cols={[{k:'n',l:'Partenaire',w:'2.2fr'},{k:'e',l:'Environnement',w:'1fr'},{k:'g',l:'Grade commercial',w:'1fr',hideM:1},{k:'b',l:'Solde production',w:'1.1fr',r:1},{k:'c',l:'Appels · 30 j',w:'.8fr',r:1,hideM:1},{k:'st',l:'Statut',w:'.8fr'}]}
      rows={(d?.donnees||[]).map(p=>({n:<span style={{display:'flex', alignItems:'center', gap:10, minWidth:0}}><PLogo p={p}/><span style={{minWidth:0}}><span style={{display:'block', fontWeight:700, overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap'}}>{p.nom}</span><span style={{display:'block', fontSize:12, color:V.ink3, fontWeight:500}}>{SECTEUR_L[p.secteur]||'—'}{p.proprietaire ? ` · ${p.proprietaire}` : ''}</span></span></span>,
        e:<Badge tone={p.production?'ok':'warn'} dot>{p.production?'Production':'Sandbox'}</Badge>, g:<Badge tone="deep" icon="lock-simple">{GRADE_L[p.grade]||p.grade}</Badge>, b:<Money n={p.solde} s={13.5}/>, c:<span style={{color:V.ink2}}>{fmt(p.appels_30j)}</span>, st:<Badge tone={p.statut==='actif'?'ok':'bad'} dot>{p.statut==='actif'?'Actif':'Suspendu'}</Badge>}))}
      onRow={i=>aller('partner', d.donnees[i].id)} empty={<EmptyS icon="buildings" title="Aucun partenaire" sub="Aucun compte ne correspond à ces filtres."/>}/>}
    <Notice tone="info" icon="lock-simple">Le grade commercial n'est visible que dans cette console. Le partenaire ne voit que ses remises et frais par opération.</Notice></Page>;
}

function A2NewPartner(){
  const toast = useToast(); const {peut} = useAdm();
  const [s, setS] = React.useState(0), [v, setV] = React.useState({raison_sociale:'', code:'', secteur:'banque', pays:'Sénégal', ninea:'', site_web:'', prenom:'', nom:'', email:'', telephone:'', fonction:'', grade:'silver', plafond_operation:'5 000 000', seuil_alerte:'2 000 000', production_directe:false, ips:''});
  const [svc, setSvc] = React.useState({assurance:true}), [fait, setFait] = React.useState(null), [err, setErr] = React.useState(null), [load, setLoad] = React.useState(false);
  const up = (k) => (e) => setV({...v, [k]: e?.target ? e.target.value : e});
  const steps = ['Entreprise','Propriétaire du compte','Conditions','Accès'];
  const valide = [v.raison_sociale.length>=2, v.prenom && v.nom && /\S+@\S+\.\S+/.test(v.email), +v.plafond_operation > 0, true][s];
  const creer = async () => { setLoad(true); setErr(null);
    try { const r = await api('POST', 'partenaires', {...v, plafond_operation:+v.plafond_operation.replace(/\s/g,''), seuil_alerte:+v.seuil_alerte.replace(/\s/g,''), services:Object.keys(svc).filter(k=>svc[k]), ip_autorisees:v.ips.split(/[\s,;]+/).filter(Boolean)}); setFait(r); toast('Partenaire créé'); }
    catch(e){ setErr(e.message); } setLoad(false); };
  if(!peut('partenaires')) return <Page max={640}><Notice tone="warn" title="Droit insuffisant">Votre rôle ne permet pas d'ajouter un partenaire.</Notice></Page>;
  if(fait) return <Page max={640}><Card pad={36} style={{textAlign:'center', display:'flex', flexDirection:'column', alignItems:'center', gap:12, marginTop:20}}>
    <Tile icon="paper-plane-tilt" s={64} fill/><H s={24}>Partenaire créé</H><Muted>Une invitation a été envoyée à <b style={{color:V.ink}}>{fait.invitation_envoyee_a}</b>. La sandbox est ouverte dès l'activation du compte.</Muted>
    <KV rows={[['Référence de virement', fait.reference_virement, null, 1], ['Production', fait.production ? 'Ouverte directement' : 'Après approbation du dossier']]}/>
    <div style={{display:'flex', gap:8, marginTop:8}}><Btn kind="secondary" onClick={()=>aller('partners')}>Retour à la liste</Btn><Btn onClick={()=>aller('partner', fait.id)}>Ouvrir la fiche</Btn></div></Card></Page>;
  return <Page max={880}><PageHead back="Partenaires" onBack={()=>aller('partners')} title="Ajouter un partenaire" sub="Le propriétaire reçoit une invitation pour définir son mot de passe et activer la double authentification."/>
    <Progress steps={steps} i={s}/>
    <Card pad={24} style={{display:'flex', flexDirection:'column', gap:18}}><H s={18}>{steps[s]}</H>
      {s===0 && <Grid cols="1fr 1fr"><Field label="Raison sociale"><Inp value={v.raison_sociale} onChange={up('raison_sociale')} placeholder="Banque Atlantique Sénégal"/></Field><Field label="Code court" hint="Sert à la référence de virement LMS-CODE-XXXXXX." opt><Inp value={v.code} onChange={e=>setV({...v, code:e.target.value.toUpperCase().replace(/[^A-Z0-9]/g,'').slice(0,8)})} placeholder="BAS" mono/></Field>
        <Field label="Secteur"><Sel value={v.secteur} onChange={up('secteur')} opts={SECTEURS}/></Field><Field label="Pays"><Sel value={v.pays} onChange={up('pays')} opts={PAYS}/></Field>
        <Field label="NINEA" opt><Inp value={v.ninea} onChange={up('ninea')} placeholder="000 000 000 0X0" mono/></Field><Field label="Site web" opt><Inp value={v.site_web} onChange={up('site_web')} placeholder="https://"/></Field></Grid>}
      {s===1 && <Grid cols="1fr 1fr"><Field label="Prénom"><Inp value={v.prenom} onChange={up('prenom')}/></Field><Field label="Nom"><Inp value={v.nom} onChange={up('nom')}/></Field>
        <Field label="Email professionnel" hint="L'invitation est envoyée à cette adresse."><Inp type="email" value={v.email} onChange={up('email')}/></Field><Field label="Téléphone" opt><Inp value={v.telephone} onChange={up('telephone')} placeholder="+221 77 000 00 00"/></Field>
        <Field label="Fonction" opt><Inp value={v.fonction} onChange={up('fonction')}/></Field></Grid>}
      {s===2 && <><Field label="Grade commercial" hint="Interne. Détermine la remise partenaire appliquée à chaque opération."><Sel value={v.grade} onChange={up('grade')} opts={GRADES}/></Field>
        <div><Lbl style={{marginBottom:10}}>Services ouverts</Lbl><div style={{display:'grid', gridTemplateColumns:useMob()?'1fr':'1fr 1fr', gap:8}}>{Object.entries(SVCS).map(([k,x])=><div key={k} style={{display:'flex', alignItems:'center', gap:12, padding:'12px 14px', borderRadius:16, border:`1px solid ${V.line}`, opacity:x.on?1:.6}}><SvcArt k={k} s={34}/><span style={{flex:1, fontWeight:700, fontSize:13.5}}>{x.n}{!x.on && <span style={{display:'block', fontSize:11.5, color:V.ink3, fontWeight:600}}>Bientôt</span>}</span><Toggle on={!!svc[k]} set={y=>x.on && setSvc({...svc,[k]:y})} label={x.n}/></div>)}</div></div>
        <Grid cols="1fr 1fr"><Field label="Plafond par opération"><Inp value={v.plafond_operation} onChange={up('plafond_operation')} trail="F CFA"/></Field><Field label="Seuil d'alerte solde bas"><Inp value={v.seuil_alerte} onChange={up('seuil_alerte')} trail="F CFA"/></Field></Grid></>}
      {s===3 && <><Notice tone="warn" icon="flask" title="Sandbox ouverte dès l'activation">Le partenaire peut créer ses clés lms_test_ et tester immédiatement.</Notice>
        <div><Lbl style={{marginBottom:10}}>Production</Lbl>{[['Exiger le dossier de production','Recommandé. Le partenaire dépose ses documents, l\'équipe conformité valide.'],['Ouvrir directement la production','Partenaire déjà vérifié hors plateforme. Tracé dans le journal d\'audit.']].map((o,i)=><label key={i} className="lc" style={{display:'flex', gap:12, alignItems:'flex-start', padding:'14px 16px', borderRadius:16, marginBottom:8, border:`1.5px solid ${(v.production_directe?1:0)===i?V.acc:V.line}`, background:(v.production_directe?1:0)===i?V.mint:V.card, cursor:'pointer'}}><input type="radio" checked={(v.production_directe?1:0)===i} onChange={()=>setV({...v, production_directe:i===1})} style={{accentColor:'#3E9378', marginTop:3}}/><span><span style={{display:'block', fontWeight:700, fontSize:13.5}}>{o[0]}</span><span style={{display:'block', fontSize:12.5, color:V.ink3, marginTop:2}}>{o[1]}</span></span></label>)}</div>
        <Field label="IP de production autorisées" hint="Séparées par des virgules. Une liste vide refuse toutes les clés live." opt><Inp value={v.ips} onChange={up('ips')} placeholder="196.207.x.x, …" mono/></Field>
        {err && <Notice tone="bad">{err}</Notice>}</>}
      <div style={{display:'flex', gap:8, paddingTop:16, borderTop:`1px solid ${V.line}`}}>{s>0 && <Btn kind="secondary" icon="arrow-left" onClick={()=>setS(s-1)}>Précédent</Btn>}<span style={{flex:1}}></span>{s<3 ? <Btn iconR="arrow-right" disabled={!valide} onClick={()=>setS(s+1)}>Continuer</Btn> : <Btn icon="paper-plane-tilt" disabled={load} onClick={creer}>{load?'Création…':'Créer et envoyer l\'invitation'}</Btn>}</div>
    </Card></Page>;
}

function A2Partner({param}){
  const toast = useToast(); const {peut, mode} = useAdm(); const id = param;
  const [f, recharger, etat] = useDonnees(() => api('GET', `partenaires/${id}`), [id]);
  const [tab, setTab] = React.useState(0), [modal, setModal] = React.useState(null), [form, setForm] = React.useState({}), [occupe, setOccupe] = React.useState(false);
  const onglets = ['operations','mouvements','cles','equipe','journal'];
  const [page, setPage] = React.useState(1);
  const [t, rechargerT, etatT] = useDonnees(() => tab >= 1 && tab <= 5 ? api('GET', `partenaires/${id}/details?onglet=${onglets[tab-1]}&mode=${mode}&page=${page}`) : Promise.resolve(null), [id, tab, mode, page]);
  const [dos] = useDonnees(() => tab === 6 ? api('GET', `dossiers/${id}`).catch(()=>null) : Promise.resolve(null), [id, tab]);
  const agir = async (fn, ok) => { setOccupe(true); try { await fn(); toast(ok); setModal(null); recharger(); } catch(e){ toast(e.message, 'bad'); } setOccupe(false); };
  if(etat.erreur) return <Page max={1280}><PageHead back="Partenaires" onBack={()=>aller('partners')} title="Partenaire"/><Erreur e={etat.erreur} recharger={recharger}/></Page>;
  if(!f) return <Page max={1280}><Skel h={60}/><Skel h={200}/></Page>;
  const p = f.partenaire, c = f.conditions, so = f.soldes, co = f.consommation_30j, act = p.statut === 'actif';
  const TABS = ['Aperçu','Opérations','Solde et mouvements','Clés et IP','Équipe','Journal','Dossier'];
  const tabIdx = (k) => { setTab(k); setPage(1); };
  return <Page max={1280}>
    <PageHead back="Partenaires" onBack={()=>aller('partners')} title={<span style={{display:'flex', alignItems:'center', gap:14}}><PLogo p={p} s={48}/>{p.nom}</span>} sub={[SECTEUR_L[p.secteur], p.pays, p.ninea && `NINEA ${p.ninea}`, `partenaire depuis le ${D(p.cree_le, false)}`].filter(Boolean).join(' · ')}
      actions={<>{peut('ajustements') && <Btn kind="secondary" icon="plus-circle" onClick={()=>{setForm({sens:'credit', montant:'', motif:'', mode:'live'}); setModal('credit');}}>Ajustement de solde</Btn>}
        {peut('partenaires') && !p.production && <Btn kind="secondary" icon="globe" onClick={()=>{setForm({motif:''}); setModal('prod');}}>Ouvrir la production</Btn>}
        {peut('partenaires') && (act ? <Btn kind="danger" icon="pause-circle" onClick={()=>{setForm({motif:''}); setModal('sus');}}>Suspendre</Btn> : <Btn icon="play-circle" disabled={occupe} onClick={()=>agir(()=>api('POST', `partenaires/${id}/suspension`, {suspendre:false}), 'Partenaire réactivé')}>Réactiver</Btn>)}</>}/>
    <div style={{display:'flex', gap:8, flexWrap:'wrap'}}><Badge tone={act?'ok':'bad'} dot>{act?'Actif':'Suspendu'}</Badge><Badge tone={p.production?'ok':'warn'} icon={p.production?'globe':'flask'}>{p.production?'Production':'Sandbox'}</Badge><Badge tone="deep" icon="lock-simple">{GRADE_L[c.grade]}</Badge><StageB st={p.dossier_stage}/>{p.proprietaire && <Badge>Propriétaire : {p.proprietaire}</Badge>}</div>
    <Tabs opts={TABS} i={tab} set={tabIdx}/>
    {tab===0 && <><Grid cols="1fr 1fr 1fr">
        <Card><Lbl>Solde de production</Lbl><div style={{marginTop:10}}><Money n={so.live} s={26}/></div><Muted style={{marginTop:6}}>Seuil d'alerte : {fmt(so.seuil_alerte)} F CFA · Référence de virement <Mono c={V.ink}>{p.reference_virement || '—'}</Mono></Muted></Card>
        <Card><Lbl>Solde sandbox</Lbl><div style={{marginTop:10}}><Money n={so.test} s={26} muted/></div><Muted style={{marginTop:6}}>Argent fictif, pour les tests.</Muted></Card>
        <Card><H s={16} style={{marginBottom:8}}>Consommation · 30 jours</H><KV rows={[['Appels',fmt(co.appels)],['Opérations réussies',fmt(co.operations)],['Montant débité',`${fmt(co.montant_debite)} F CFA`],['Volume client',`${fmt(co.volume_client)} F CFA`],['Taux d\'erreur',pct(co.taux_erreur)]]}/></Card></Grid>
      <Grid cols="1fr 1fr 1fr">
        <Conditions p={p} c={c} peut={peut('partenaires')} recharger={recharger}/>
        <Card style={{display:'flex', flexDirection:'column', gap:10}}><H s={16}>Services ouverts</H>{Object.entries(SVCS).map(([k,x])=><div key={k} style={{display:'flex', alignItems:'center', gap:10}}><SvcArt k={k} s={28}/><span style={{flex:1, fontWeight:600, fontSize:13.5, color:p.services.includes(k)?V.ink:V.ink3}}>{x.n}</span>{p.services.includes(k) ? <Badge tone="ok" dot>Ouvert</Badge> : <Badge>{x.on?'Fermé':'Bientôt'}</Badge>}</div>)}</Card>
        <Card><H s={16} style={{marginBottom:8}}>Contacts</H><KV rows={[['Propriétaire', p.proprietaire || '—'], ['Email', p.email || '—'], ['Technique', f.contacts?.technique || '—'], ['Finance', f.contacts?.finance || '—'], ['Urgence', f.contacts?.urgence || '—'], ['Alertes', f.contacts?.email_alertes || '—']]}/></Card></Grid></>}
    {tab>0 && tab<6 && etatT.erreur && <Erreur e={etatT.erreur} recharger={rechargerT}/>}
    {tab===1 && !etatT.erreur && <Tbl chargement={!t} cols={[{k:'r',l:'Référence',w:'1.3fr'},{k:'a',l:'Assuré',w:'1fr',hideM:1},{k:'i',l:'Assureur',w:'.9fr'},{k:'px',l:'Prix client',w:'.9fr',r:1},{k:'m',l:'Débité',w:'.9fr',r:1},{k:'c',l:'Date',w:'.8fr',hideM:1},{k:'s',l:'Statut',w:'1fr'}]} rows={(t?.donnees||[]).map(o=>({r:<span><Mono c={V.ink}>{o.reference}</Mono><span style={{display:'block', fontSize:11.5, color:V.ink3}}>{o.immatriculation}</span></span>, a:o.assure, i:ASS(o.assureur), px:<Money n={o.prix_client} s={13.5} muted/>, m:<Money n={o.montant_debite} s={13.5}/>, c:<span style={{color:V.ink2, fontSize:12.5}}>{DC(o.cree_le)}</span>, s:<StatusB st={o.statut}/>}))} empty={<EmptyS icon="list-checks" title={`Aucune opération ${mode==='live'?'en production':'en sandbox'}`}/>} foot={t && t.total > 25 && <Pager n={t.total} page={page} set={setPage}/>}/>}
    {tab===2 && !etatT.erreur && <Tbl chargement={!t} cols={[{k:'d',l:'Date',w:'.9fr'},{k:'t',l:'Type',w:'.9fr'},{k:'r',l:'Libellé',w:'1.8fr',hideM:1},{k:'a',l:'Montant',w:'1.1fr',r:1},{k:'b',l:'Solde après',w:'1.1fr',r:1}]} rows={(t?.donnees||[]).map(x=>({d:<span style={{color:V.ink2, whiteSpace:'nowrap'}}>{DC(x.date)}</span>, t:<Badge tone={(MV_T[x.type]||MV_T.debit)[1]}>{(MV_T[x.type]||[x.type])[0]}</Badge>, r:<span style={{fontSize:13, color:V.ink2}}>{x.libelle || x.reference}</span>, a:<Money n={x.montant} s={13.5} sign/>, b:<Money n={x.solde_apres} s={13.5} muted/>}))} empty={<EmptyS icon="wallet" title="Aucun mouvement"/>} foot={t && t.total > 25 && <Pager n={t.total} page={page} set={setPage}/>}/>}
    {tab===3 && !etatT.erreur && <Grid cols="minmax(0,1.5fr) minmax(0,1fr)"><Tbl chargement={!t} cols={[{k:'n',l:'Clé',w:'1.4fr'},{k:'p',l:'Préfixe',w:'1.1fr'},{k:'u',l:'Dernière utilisation',w:'1fr'},{k:'s',l:'Statut',w:'.8fr'}]} rows={(t?.donnees||[]).map(k=>({n:<b>{k.nom}</b>, p:<Mono c={V.ink}>{k.prefixe}…</Mono>, u:<span style={{color:V.ink2}}>{k.derniere_utilisation ? Depuis(k.derniere_utilisation) : 'Jamais'}</span>, s:<StatusB st={k.statut}/>}))} empty={<EmptyS icon="key" title="Aucune clé"/>}/>
      <Card style={{display:'flex', flexDirection:'column', gap:10}}><H s={16}>IP autorisées</H>{p.ip_autorisees.length ? p.ip_autorisees.map(x=><div key={x} style={{padding:'9px 12px', borderRadius:12, background:V.sub}}><Mono c={V.ink}>{x}</Mono></div>) : <Muted>Aucune : toutes les clés live sont refusées.</Muted>}<Muted style={{fontSize:12}}>Gérées par le partenaire (Paramètres), avec son code 2FA.</Muted></Card></Grid>}
    {tab===4 && !etatT.erreur && <Tbl chargement={!t} cols={[{k:'n',l:'Membre',w:'1.6fr'},{k:'r',l:'Rôle',w:'1fr'},{k:'f',l:'2FA',w:'.6fr'},{k:'l',l:'Dernière activité',w:'1fr'}]} rows={(t?.donnees||[]).map(m=>({n:<span style={{display:'flex', alignItems:'center', gap:10, minWidth:0}}><Av n={`${m.prenom} ${m.nom}`}/><span style={{minWidth:0}}><b style={{display:'block'}}>{m.prenom} {m.nom}</b><span style={{fontSize:12, color:V.ink3, fontWeight:500}}>{m.email}</span></span></span>, r:<Badge>{ROLES_M[m.role]||m.role}</Badge>, f:m.totp_actif ? <Badge tone="ok" icon="check-circle">Active</Badge> : <Badge tone="warn">À activer</Badge>, l:<span style={{color:V.ink2}}>{m.derniere_activite ? Depuis(m.derniere_activite) : '—'}</span>}))}/>}
    {tab===5 && !etatT.erreur && <Tbl chargement={!t} cols={[{k:'d',l:'Date',w:'.9fr'},{k:'a',l:'Action',w:'1.8fr'},{k:'u',l:'Par',w:'1.2fr'}]} rows={(t?.donnees||[]).map(r=>({d:<Mono>{DC(r.date)}</Mono>, a:<span><b style={{fontWeight:600}}>{libelleAction(r.action)}</b>{r.cible && <span style={{display:'block', fontSize:12, color:V.ink3}}>{r.cible}</span>}</span>, u:<span style={{color:V.ink2}}>{r.par}</span>}))} empty={<EmptyS icon="clock-counter-clockwise" title="Journal vide"/>} foot={t && t.total > 25 && <Pager n={t.total} page={page} set={setPage}/>}/>}
    {tab===6 && <Card style={{display:'flex', flexDirection:'column', gap:10}}><div style={{display:'flex', alignItems:'center', gap:10}}><H s={16} style={{flex:1}}>Dossier de production</H><StageB st={p.dossier_stage}/>{['submitted','review','modification'].includes(p.dossier_stage) && <Btn sm onClick={()=>aller('dossier', id)}>Examiner</Btn>}</div>
      {!dos ? <Skel h={80}/> : dos.documents.map(d=><div key={d.type} style={{display:'flex', alignItems:'center', gap:10, padding:'10px 0', borderTop:`1px solid ${V.line}`}}><I n={d.statut==='valide'?'file-check':'file-text'} s={20} c={d.statut==='valide'?V.acc:V.ink3}/><span style={{flex:1, fontWeight:600, fontSize:13.5}}>{d.libelle}{!d.requis && <span style={{color:V.ink3, fontWeight:500}}> (facultatif)</span>}</span><StatusB st={d.statut}/></div>)}
      {p.approuve_le && <Muted>Approuvé le {D(p.approuve_le)}.</Muted>}</Card>}
    {modal==='sus' && <Modal title={`Suspendre ${p.nom} ?`} icon="pause-circle" tone="bad" onClose={()=>setModal(null)} foot={<><Btn kind="secondary" onClick={()=>setModal(null)}>Annuler</Btn><Btn kind="danger" disabled={(form.motif||'').length<3||occupe} onClick={()=>agir(()=>api('POST', `partenaires/${id}/suspension`, {suspendre:true, motif:form.motif}), 'Partenaire suspendu')}>Suspendre</Btn></>}><Muted>Tous les appels API seront refusés (compte_suspendu). Les soldes restent intacts et les contrats émis restent valides.</Muted><Field label="Motif (interne)"><Inp value={form.motif} onChange={e=>setForm({...form, motif:e.target.value})} placeholder="Impayé, suspicion de fraude, demande du partenaire…"/></Field></Modal>}
    {modal==='prod' && <Modal title="Ouvrir la production sans dossier ?" icon="globe" tone="warn" onClose={()=>setModal(null)} foot={<><Btn kind="secondary" onClick={()=>setModal(null)}>Annuler</Btn><Btn disabled={(form.motif||'').length<5||occupe} onClick={()=>agir(()=>api('POST', `partenaires/${id}/production`, {ouvrir:true, motif:form.motif}), 'Production ouverte')}>Ouvrir la production</Btn></>}><Muted>Réservé à un partenaire déjà vérifié hors plateforme. Le partenaire pourra créer des clés live et recharger son solde. Tracé dans le journal d'audit.</Muted><Field label="Motif"><Inp value={form.motif} onChange={e=>setForm({...form, motif:e.target.value})} placeholder="Contrat signé et KYC fait le…"/></Field></Modal>}
    {modal==='credit' && <Modal title="Ajustement de solde" icon="plus-circle" onClose={()=>setModal(null)} foot={<><Btn kind="secondary" onClick={()=>setModal(null)}>Annuler</Btn><Btn disabled={!(+form.montant>0) || (form.motif||'').length<5 || occupe} onClick={()=>agir(async()=>{ const r = await api('POST', `partenaires/${id}/ajustements`, {sens:form.sens, montant:+String(form.montant).replace(/\s/g,''), motif:form.motif, mode:form.mode}); if(r.statut==='attente') toast('En attente de validation par un second administrateur'); }, 'Ajustement enregistré')}>Appliquer</Btn></>}>
      <Grid cols="1fr 1fr" mcols="1fr 1fr"><Field label="Sens"><Seg opts={['Crédit','Débit']} i={form.sens==='debit'?1:0} set={k=>setForm({...form, sens:k?'debit':'credit'})}/></Field><Field label="Solde"><Seg opts={['Production','Sandbox']} i={form.mode==='test'?1:0} set={k=>setForm({...form, mode:k?'test':'live'})}/></Field></Grid>
      <Field label="Montant"><Inp value={form.montant ? fmt(+form.montant) : ''} onChange={e=>setForm({...form, montant:e.target.value.replace(/[^\d]/g,'')})} trail="F CFA" placeholder="0" inputMode="numeric"/></Field>
      <Field label="Motif (visible dans le relevé du partenaire)"><Inp value={form.motif} onChange={e=>setForm({...form, motif:e.target.value})} placeholder="Geste commercial, correction…"/></Field>
      <Notice tone="warn">Tracé dans le journal d'audit. Validation par un second administrateur au-delà du seuil de double validation (Paramètres).</Notice></Modal>}
  </Page>;
}

function Conditions({p, c, peut, recharger}){
  const toast = useToast(); const [g, setG] = React.useState(c.grade), [pl, setPl] = React.useState(String(c.plafond_operation)), [load, setLoad] = React.useState(false);
  const change = g !== c.grade || +pl !== c.plafond_operation;
  return <Card style={{display:'flex', flexDirection:'column', gap:12}}><H s={16}>Conditions</H>
    <Field label="Grade commercial" hint="Interne. Changement tracé dans le journal."><Sel value={g} onChange={setG} opts={GRADES} style={peut?undefined:{pointerEvents:'none', opacity:.7}}/></Field>
    <Field label="Plafond par opération"><Inp value={pl ? fmt(+pl) : ''} onChange={e=>setPl(e.target.value.replace(/[^\d]/g,''))} trail="F CFA" inputMode="numeric" disabled={!peut}/></Field>
    <KV rows={[['Remise assurance', `${Math.round(c.remise_taux*1000)/10} % + ${fmt(c.remise_forfait)} F`], ['Frais de service', `${Math.round(c.frais_taux*10000)/100} % du TTC`]]}/>
    {peut && change && <Btn sm disabled={load} onClick={async()=>{ setLoad(true); try { await api('PATCH', `partenaires/${p.id}`, {grade:g, plafond_operation:+pl}); toast('Conditions enregistrées'); recharger(); } catch(e){ toast(e.message, 'bad'); } setLoad(false); }}>Enregistrer</Btn>}</Card>;
}

const ACTIONS_L = {partenaire_cree:'Partenaire créé · invitation envoyée', partenaire_cree_production_directe:'Partenaire créé · production ouverte directement', dossier_en_revue:'Dossier passé en revue', piece_validee:'Pièce validée', piece_a_corriger:'Pièce à corriger', piece_consultee:'Pièce consultée', dossier_approved:'Dossier approuvé · production ouverte', dossier_info:'Corrections demandées', dossier_refused:'Dossier refusé', dossier_envoye:'Dossier envoyé', depot_valide:'Dépôt validé', depot_rejete:'Dépôt rejeté', preuve_consultee:'Avis de virement consulté', ajustement_applique:'Ajustement appliqué', ajustement_demande:'Ajustement demandé (double validation)', ajustement_refuse:'Ajustement refusé', partenaire_suspendu:'Partenaire suspendu', partenaire_reactive:'Partenaire réactivé', production_ouverte_directement:'Production ouverte directement', production_fermee:'Production fermée', conditions_modifiees:'Conditions modifiées', resiliation_traitee:'Résiliation enregistrée', resiliation_refusee:'Résiliation refusée', verification_relancee:'Vérification relancée', incident_publie:'Incident publié', incident_resolu:'Incident résolu', incident_mis_a_jour:'Incident mis à jour', membre_interne_invite:'Membre interne invité', membre_interne_modifie:'Membre interne modifié', parametres_modifies:'Paramètres modifiés', connexion:'Connexion', connexion_code_secours:'Connexion (code de secours)', '2fa_activee':'Double authentification activée', mot_de_passe_defini:'Mot de passe défini', inscription:'Inscription', cle_creee:'Clé créée', cle_revoquee:'Clé révoquée'};
const libelleAction = (a) => ACTIONS_L[a] || (a||'').replace(/_/g, ' ').replace(/^./, c=>c.toUpperCase());
Object.assign(window, {A2Partners, A2NewPartner, A2Partner, GRADES, GRADE_L, SECTEUR_L, libelleAction, MV_T});
