// payment.jsx — Paiement d'acompte (signature + carte/virement) ou paiement du solde
const { useState: useP } = React;
function eu(n){ return n.toLocaleString('fr-FR')+' €'; }

const LBC_BANK = { beneficiaire:'LBC Déménagement SAS', iban:'FR76 3000 4008 2800 0001 2345 678', bic:'BNPAFRPPXXX' };

function CopyRow({ label, value, big, onCopy }) {
  const [c, setC] = useP(false);
  const copy = ()=>{ navigator.clipboard?.writeText(value.replace(/\s/g,'')).catch(()=>{}); setC(true); onCopy&&onCopy(); setTimeout(()=>setC(false),1600); };
  return (
    <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:12, padding:'12px 0', borderBottom:'1px solid var(--border)' }}>
      <div style={{ minWidth:0 }}>
        <div style={{ fontSize:11.5, color:'var(--muted)' }}>{label}</div>
        <div className={big?'mono':''} style={{ fontSize: big?14.5:13.5, fontWeight:600, color:'var(--ink)', marginTop:2, letterSpacing: big?'.02em':'0', wordBreak:'break-all' }}>{value}</div>
      </div>
      <button onClick={copy} style={{ color: c?'var(--effectue)':'var(--muted)', display:'flex', padding:7, borderRadius:8, flexShrink:0 }}
        onMouseEnter={e=>e.currentTarget.style.background='var(--hover)'} onMouseLeave={e=>e.currentTarget.style.background='transparent'}><Icon name={c?'check':'copy'} size={16} /></button>
    </div>
  );
}

function SignaturePad({ onDrawn }) {
  const cv = React.useRef(null);
  const drawing = React.useRef(false);
  const last = React.useRef(null);
  const has = React.useRef(false);
  React.useEffect(()=>{ const c=cv.current; if(!c) return; c.width=c.offsetWidth*2; c.height=c.offsetHeight*2; const ctx=c.getContext('2d'); ctx.scale(2,2); },[]);
  const pos = (e)=>{ const r=cv.current.getBoundingClientRect(); const t=e.touches?e.touches[0]:e; return { x:t.clientX-r.left, y:t.clientY-r.top }; };
  const start = (e)=>{ drawing.current=true; last.current=pos(e); };
  const move = (e)=>{ if(!drawing.current) return; const ctx=cv.current.getContext('2d'); const p=pos(e); ctx.strokeStyle='#14384E'; ctx.lineWidth=2.2; ctx.lineCap='round'; ctx.beginPath(); ctx.moveTo(last.current.x,last.current.y); ctx.lineTo(p.x,p.y); ctx.stroke(); last.current=p; if(!has.current){ has.current=true; onDrawn(true); } e.preventDefault&&e.preventDefault(); };
  const end = ()=>{ drawing.current=false; };
  const clear = ()=>{ const c=cv.current; c.getContext('2d').clearRect(0,0,c.width,c.height); has.current=false; onDrawn(false); };
  return (
    <div>
      <div style={{ position:'relative', border:'1px dashed var(--border-2)', borderRadius:12, background:'var(--bg)', height:140 }}>
        <canvas ref={cv} style={{ width:'100%', height:'100%', touchAction:'none', cursor:'crosshair' }}
          onMouseDown={start} onMouseMove={move} onMouseUp={end} onMouseLeave={end}
          onTouchStart={start} onTouchMove={move} onTouchEnd={end} />
        <span style={{ position:'absolute', left:0, right:0, bottom:14, textAlign:'center', fontSize:12, color:'var(--faint)', pointerEvents:'none' }}>✍️ Signez ici</span>
        <button onClick={clear} style={{ position:'absolute', top:8, right:10, fontSize:12, color:'var(--muted)', display:'flex', alignItems:'center', gap:4 }}><Icon name="x" size={13} />Effacer</button>
      </div>
    </div>
  );
}

function PaymentFlow({ total, reference, date, mode='acompte', onComplete, onClose, showToast }) {
  const deposit = Math.round(total*0.3);
  const solde = total - deposit;
  const isSolde = mode==='solde';
  const amount = isSolde ? solde : deposit;
  const [step, setStep] = useP(isSolde ? 'method' : 'sign');
  const [chosen, setChosen] = useP(null);
  const [signed, setSigned] = useP(false);
  const [agree, setAgree] = useP(false);
  const [card, setCard] = useP({ num:'', exp:'', cvc:'', name:'' });
  const setC = (k,v)=> setCard(s=>({ ...s, [k]:v }));
  const cardOk = card.num.replace(/\s/g,'').length>=16 && card.exp.length===5 && card.cvc.length>=3 && card.name.trim().length>2;
  const fmtNum = v => v.replace(/\D/g,'').slice(0,16).replace(/(.{4})(?=.)/g,'$1 ').trim();
  const fmtExp = v => { const d=v.replace(/\D/g,'').slice(0,4); return d.length>2? d.slice(0,2)+'/'+d.slice(2):d; };
  const payCard = ()=>{ setStep('processing'); setTimeout(()=>{ setChosen('carte'); onComplete('carte'); setStep('done'); }, 1600); };
  const confirmVir = ()=>{ setChosen('virement'); onComplete('virement'); setStep('done'); };

  const Header = ({ title, back }) => (
    <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', padding:'16px 18px', borderBottom:'1px solid var(--border)' }}>
      <div style={{ display:'flex', alignItems:'center', gap:10 }}>
        {back && <button onClick={()=>setStep(back)} style={{ color:'var(--muted)', display:'flex' }}><Icon name="chevronL" size={18} /></button>}
        <span style={{ fontSize:15, fontWeight:600, color:'var(--ink)' }}>{title}</span>
      </div>
      {step!=='processing' && <button onClick={onClose} style={{ color:'var(--faint)', display:'flex' }}><Icon name="x" size={18} /></button>}
    </div>
  );
  const Summary = () => (
    <div style={{ background:'var(--cream)', borderRadius:12, padding:'14px 16px', margin:'16px 18px 0' }}>
      <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center' }}>
        <span style={{ fontSize:13, color:'var(--ink-2)' }}>{isSolde ? 'Solde à régler' : <>Acompte aujourd'hui <span style={{ color:'var(--muted)' }}>(30 %)</span></>}</span>
        <span className="tnum" style={{ fontSize:18, fontWeight:700, color:'var(--brand)' }}>{eu(amount)}</span>
      </div>
      <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', marginTop:7, paddingTop:9, borderTop:'1px solid var(--cream-dim)' }}>
        <span style={{ fontSize:12.5, color:'var(--muted)' }}>{isSolde ? 'Devis total' : `Solde le jour J · ${date}`}</span>
        <span className="tnum" style={{ fontSize:13.5, fontWeight:600, color:'var(--ink-2)' }}>{isSolde ? eu(total) : eu(solde)}</span>
      </div>
    </div>
  );

  let content;
  if (step==='sign') content = (
    <>
      <Header title="Signer & réserver" />
      <Summary />
      <div style={{ padding:'16px 18px 20px' }}>
        <p style={{ fontSize:13, color:'var(--ink-2)', lineHeight:1.5, margin:'0 0 12px' }}>Signez votre devis <strong>{reference}</strong> de <strong>{eu(total)}</strong> pour le confirmer.</p>
        <SignaturePad onDrawn={setSigned} />
        <label style={{ display:'flex', gap:10, alignItems:'flex-start', marginTop:14, cursor:'pointer' }}>
          <span onClick={()=>setAgree(a=>!a)} style={{ width:20, height:20, borderRadius:6, flexShrink:0, marginTop:1, display:'flex', alignItems:'center', justifyContent:'center', background: agree?'var(--brand)':'var(--bg)', border: agree?'none':'1.5px solid var(--border-2)', color:'#fff' }}>{agree && <Icon name="check" size={12} stroke={3} />}</span>
          <span style={{ fontSize:12.5, color:'var(--ink-2)', lineHeight:1.45 }}>J'accepte le devis et les <a style={{ color:'var(--brand)', fontWeight:500 }}>conditions générales</a> de LBC Déménagement.</span>
        </label>
        <button className="btn btn-primary btn-lg btn-block" disabled={!signed||!agree} style={{ opacity:(signed&&agree)?1:.55, marginTop:16 }} onClick={()=>setStep('method')}>Continuer vers le paiement<Icon name="arrowR" size={17} /></button>
      </div>
    </>
  );
  else if (step==='method') content = (
    <>
      <Header title={isSolde ? 'Payer le solde' : 'Mode de paiement'} back={isSolde?null:'sign'} />
      <Summary />
      <div style={{ padding:'16px 18px 20px' }}>
        <div style={{ fontSize:12.5, fontWeight:600, color:'var(--muted)', textTransform:'uppercase', letterSpacing:'.05em', marginBottom:10 }}>Mode de paiement</div>
        <div style={{ display:'flex', flexDirection:'column', gap:10 }}>
          {[['card','euroCircle','Carte bancaire','Paiement immédiat et sécurisé'],
            ['virement','building','Virement bancaire', isSolde?'Sous 2–3 j ouvrés':'Créneau pré-réservé · sous 2–3 j']].map(([k,ic,t,d])=>(
            <button key={k} onClick={()=>setStep(k)} style={{ display:'flex', alignItems:'center', gap:14, width:'100%', textAlign:'left', padding:'14px 16px', border:'1px solid var(--border-2)', borderRadius:12, background:'var(--card)', transition:'.14s' }}
              onMouseEnter={e=>{ e.currentTarget.style.borderColor='var(--brand)'; e.currentTarget.style.background='var(--hover)'; }}
              onMouseLeave={e=>{ e.currentTarget.style.borderColor='var(--border-2)'; e.currentTarget.style.background='var(--card)'; }}>
              <span style={{ width:42, height:42, borderRadius:11, background:'var(--bg)', display:'flex', alignItems:'center', justifyContent:'center', color:'var(--navy)', flexShrink:0 }}><Icon name={ic} size={21} /></span>
              <div style={{ flex:1 }}><div style={{ fontSize:14.5, fontWeight:600, color:'var(--ink)' }}>{t}</div><div style={{ fontSize:12.5, color:'var(--muted)', marginTop:1 }}>{d}</div></div>
              <Icon name="chevronR" size={17} style={{ color:'var(--faint)' }} />
            </button>
          ))}
        </div>
        <div style={{ display:'flex', alignItems:'center', justifyContent:'center', gap:7, marginTop:16, fontSize:11.5, color:'var(--faint)' }}><Icon name="lock" size={13} />Paiement sécurisé · crypté SSL</div>
      </div>
    </>
  );
  else if (step==='card') content = (
    <>
      <Header title="Carte bancaire" back="method" />
      <Summary />
      <div style={{ padding:'16px 18px 20px', display:'flex', flexDirection:'column', gap:14 }}>
        <div className="field"><label className="label">Numéro de carte</label>
          <div className="input-wrap"><span className="lead-icon"><Icon name="euroCircle" size={17} /></span>
            <input className="input has-icon mono" inputMode="numeric" placeholder="4242 4242 4242 4242" value={card.num} onChange={e=>setC('num',fmtNum(e.target.value))} /></div></div>
        <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:12 }}>
          <div className="field"><label className="label">Expiration</label><input className="input mono" inputMode="numeric" placeholder="MM/AA" value={card.exp} onChange={e=>setC('exp',fmtExp(e.target.value))} /></div>
          <div className="field"><label className="label">CVC</label><input className="input mono" inputMode="numeric" placeholder="123" value={card.cvc} onChange={e=>setC('cvc',e.target.value.replace(/\D/g,'').slice(0,4))} /></div>
        </div>
        <div className="field"><label className="label">Titulaire de la carte</label><input className="input" placeholder="Élise Moreau" value={card.name} onChange={e=>setC('name',e.target.value)} /></div>
        <button className="btn btn-primary btn-lg btn-block" disabled={!cardOk} style={{ opacity: cardOk?1:.55, marginTop:2 }} onClick={payCard}><Icon name="lock" size={16} />Payer {eu(amount)}</button>
        <div style={{ display:'flex', alignItems:'center', justifyContent:'center', gap:7, fontSize:11.5, color:'var(--faint)' }}><Icon name="shield" size={13} />3-D Secure</div>
      </div>
    </>
  );
  else if (step==='virement') content = (
    <>
      <Header title="Virement bancaire" back="method" />
      <Summary />
      <div style={{ padding:'8px 18px 20px' }}>
        <p style={{ fontSize:13, color:'var(--ink-2)', lineHeight:1.5, margin:'12px 0 6px' }}>Effectuez un virement de <strong>{eu(amount)}</strong> avec la référence ci-dessous.</p>
        <CopyRow label="Bénéficiaire" value={LBC_BANK.beneficiaire} onCopy={()=>showToast&&showToast('Copié')} />
        <CopyRow label="IBAN" value={LBC_BANK.iban} big onCopy={()=>showToast&&showToast('IBAN copié')} />
        <CopyRow label="BIC" value={LBC_BANK.bic} onCopy={()=>showToast&&showToast('Copié')} />
        <CopyRow label="Référence à indiquer" value={reference} onCopy={()=>showToast&&showToast('Référence copiée')} />
        <CopyRow label="Montant" value={eu(amount)} onCopy={()=>showToast&&showToast('Copié')} />
        <button className="btn btn-primary btn-lg btn-block" style={{ marginTop:18 }} onClick={confirmVir}><Icon name="check" size={17} />J'ai effectué le virement</button>
        <button className="btn btn-ghost btn-block" style={{ height:44, marginTop:9 }} onClick={onClose}>Plus tard</button>
      </div>
    </>
  );
  else if (step==='processing') content = (
    <div style={{ padding:'56px 24px', textAlign:'center' }}>
      <div className="pay-spin" style={{ width:46, height:46, margin:'0 auto', borderRadius:'50%', border:'3px solid var(--border)', borderTopColor:'var(--brand)' }} />
      <div style={{ fontSize:15, fontWeight:600, color:'var(--ink)', marginTop:20 }}>Paiement en cours…</div>
      <div style={{ fontSize:13, color:'var(--muted)', marginTop:4 }}>Ne fermez pas cette fenêtre.</div>
    </div>
  );
  else content = (
    <div style={{ padding:'40px 26px 30px', textAlign:'center', position:'relative', overflow:'hidden' }}>
      {[...Array(12)].map((_,i)=>(<span key={i} style={{ position:'absolute', left:`${8+i*7}%`, top:10, width:7, height:7, borderRadius:2, background:['#B63D24','#E0411F','#16965A','#C2992E','#15384E'][i%5], animation:`confetti 1s ${i*0.05}s ease-out both` }} />))}
      <svg width="84" height="84" viewBox="0 0 92 92" style={{ margin:'0 auto', position:'relative' }}>
        <circle cx="46" cy="46" r="42" fill="rgba(22,150,90,.08)" />
        <circle cx="46" cy="46" r="42" fill="none" stroke="var(--effectue)" strokeWidth="3" className="check-circle" style={{ transformOrigin:'center', transform:'rotate(-90deg)' }} />
        <path d="M30 47 l11 11 l22 -24" fill="none" stroke="var(--effectue)" strokeWidth="4.5" strokeLinecap="round" strokeLinejoin="round" className="check-tick" />
      </svg>
      <h2 style={{ fontSize:21, fontWeight:600, color:'var(--ink)', margin:'18px 0 8px' }}>{isSolde ? 'Solde réglé !' : 'Déménagement réservé !'}</h2>
      <p style={{ fontSize:13.5, color:'var(--muted)', lineHeight:1.55, maxWidth:320, margin:'0 auto' }}>
        {isSolde
          ? <>Votre déménagement est <strong style={{ color:'var(--ink)' }}>intégralement réglé</strong>. Merci de votre confiance !</>
          : chosen==='carte'
            ? <>Votre acompte de <strong style={{ color:'var(--ink)' }}>{eu(deposit)}</strong> est réglé. Le créneau du <strong style={{ color:'var(--ink)' }}>{date}</strong> est confirmé.</>
            : <>Votre créneau du <strong style={{ color:'var(--ink)' }}>{date}</strong> est pré-réservé. Il sera confirmé dès réception de votre virement de <strong style={{ color:'var(--ink)' }}>{eu(deposit)}</strong>.</>}
      </p>
      <button className="btn btn-primary btn-lg btn-block" style={{ marginTop:24 }} onClick={onClose}>Voir mon suivi</button>
    </div>
  );

  return (
    <div style={{ position:'absolute', inset:0, zIndex:150, display:'flex', alignItems:'flex-start', justifyContent:'center', padding:'5vh 20px 20px', overflowY:'auto', background:'rgba(10,25,35,.5)', backdropFilter:'blur(3px)', animation:'fadeIn .15s ease both' }}
      onClick={(e)=>{ if(e.target===e.currentTarget && step!=='processing') onClose(); }}>
      <div style={{ width:'100%', maxWidth:440, background:'var(--card)', borderRadius:18, overflow:'hidden', boxShadow:'var(--shadow-pop)', animation:'popUp .2s var(--ease) both' }}>{content}</div>
    </div>
  );
}

Object.assign(window, { PaymentFlow });
