/* Vocal Manager - Espace revendeur white-label */
const { useState, useEffect, useCallback, useMemo } = React;

const API = 'https://api.vocal.ch';
const TOKEN_KEY = 'vocal_manager_token';

// ---------- API helper ----------
async function api(path, opts = {}) {
  const token = localStorage.getItem(TOKEN_KEY);
  const headers = { 'Content-Type': 'application/json', ...(opts.headers || {}) };
  if (token) headers.Authorization = `Bearer ${token}`;
  const r = await fetch(`${API}${path}`, { ...opts, headers });
  const text = await r.text();
  let data = null;
  try { data = text ? JSON.parse(text) : null; } catch (_) { data = { error: text }; }
  if (!r.ok) {
    const err = new Error(data?.error || `HTTP ${r.status}`);
    err.status = r.status;
    err.data = data;
    throw err;
  }
  return data;
}

// ---------- Icons ----------
const I = {
  dashboard: <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><rect x="3" y="3" width="7" height="9"/><rect x="14" y="3" width="7" height="5"/><rect x="14" y="12" width="7" height="9"/><rect x="3" y="16" width="7" height="5"/></svg>,
  clients: <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>,
  packs: <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg>,
  branding: <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><circle cx="13.5" cy="6.5" r="1.5" fill="currentColor"/><circle cx="17.5" cy="10.5" r="1.5" fill="currentColor"/><circle cx="8.5" cy="7.5" r="1.5" fill="currentColor"/><circle cx="6.5" cy="12.5" r="1.5" fill="currentColor"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"/></svg>,
  stripe: <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><rect x="2" y="5" width="20" height="14" rx="2"/><line x1="2" y1="10" x2="22" y2="10"/></svg>,
  logout: <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>,
  copy: <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>,
};

// ---------- Auth screen ----------
function AuthScreen({ branding, onAuth }) {
  const [step, setStep] = useState('email');
  const [email, setEmail] = useState('');
  const [code, setCode] = useState('');
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState('');

  useEffect(() => {
    const params = new URLSearchParams(location.search);
    const e = params.get('email');
    const c = params.get('code');
    if (e && c) {
      setEmail(e); setCode(c); setStep('code');
      verifyCode(e, c);
    }
  }, []);

  async function requestCode(e) {
    e?.preventDefault();
    setError(''); setLoading(true);
    try {
      await api('/reseller/auth/request-code', {
        method: 'POST',
        body: JSON.stringify({ email, host: location.host }),
      });
      setStep('code');
    } catch (err) {
      setError(err.message);
    } finally { setLoading(false); }
  }

  async function verifyCode(em, co) {
    setError(''); setLoading(true);
    try {
      const r = await api('/reseller/auth/verify-code', {
        method: 'POST',
        body: JSON.stringify({ email: em || email, code: co || code }),
      });
      localStorage.setItem(TOKEN_KEY, r.token);
      onAuth(r);
      history.replaceState({}, '', location.pathname);
    } catch (err) {
      setError(err.message);
    } finally { setLoading(false); }
  }

  return (
    <div className="auth-screen">
      <div className="auth-card">
        <div className="auth-logo">
          {branding?.logo_url
            ? <img src={branding.logo_url} alt={branding.brand_name} />
            : <div style={{fontWeight:800,fontSize:'1.4rem',color:'var(--brand)'}}>{branding?.brand_name || 'Vocal Manager'}</div>
          }
        </div>
        <h1 className="auth-title">{branding?.brand_name || 'Vocal Manager'}</h1>
        <p className="auth-sub">Espace revendeur</p>
        {error && <div className="error-banner">{error}</div>}
        {step === 'email' && (
          <form onSubmit={requestCode}>
            <div className="form-row">
              <label>Email</label>
              <input type="email" value={email} onChange={e => setEmail(e.target.value)} required autoFocus placeholder="vous@votre-agence.ch" />
            </div>
            <button type="submit" className="btn btn-primary" style={{width:'100%',justifyContent:'center'}} disabled={loading}>
              {loading ? 'Envoi...' : 'Recevoir mon code'}
            </button>
          </form>
        )}
        {step === 'code' && (
          <form onSubmit={(e) => { e.preventDefault(); verifyCode(); }}>
            <div className="form-row">
              <label>Code reçu par email</label>
              <input type="text" value={code} onChange={e => setCode(e.target.value)} required autoFocus placeholder="123456" maxLength="6" style={{letterSpacing:'0.3em',textAlign:'center',fontSize:'1.2rem'}} />
            </div>
            <button type="submit" className="btn btn-primary" style={{width:'100%',justifyContent:'center'}} disabled={loading}>
              {loading ? 'Vérification...' : 'Se connecter'}
            </button>
            <button type="button" className="btn btn-ghost" style={{width:'100%',justifyContent:'center',marginTop:'0.5rem'}} onClick={() => setStep('email')}>
              Changer d'email
            </button>
          </form>
        )}
      </div>
    </div>
  );
}

// ---------- Sidebar ----------
function Sidebar({ current, onNav, me, branding, onLogout }) {
  const items = [
    { id: 'dashboard', label: 'Tableau de bord', icon: I.dashboard },
    { id: 'clients', label: 'Clients', icon: I.clients },
    { id: 'packs', label: 'Packs & tarifs', icon: I.packs },
    { id: 'branding', label: 'Image de marque', icon: I.branding },
    { id: 'stripe', label: 'Stripe', icon: I.stripe },
  ];
  return (
    <aside className="sidebar">
      <div className="sidebar-brand">
        {branding?.logo_url
          ? <img src={branding.logo_url} alt={branding.brand_name} />
          : <div className="name" style={{color:'var(--brand)'}}>{branding?.brand_name || 'Vocal Manager'}</div>
        }
      </div>
      {items.map(it => (
        <button key={it.id} className={`sidebar-nav-item ${current === it.id ? 'active' : ''}`} onClick={() => onNav(it.id)}>
          {it.icon}<span>{it.label}</span>
        </button>
      ))}
      <div className="sidebar-footer">
        <div style={{marginBottom:'0.5rem'}}>
          <div style={{fontWeight:600,color:'var(--text)',fontSize:'0.85rem'}}>{me?.user?.full_name || me?.user?.email}</div>
          <div style={{fontSize:'0.75rem'}}>{me?.reseller?.name}</div>
        </div>
        <button className="sidebar-nav-item" onClick={onLogout} style={{padding:'0.4rem 0.6rem'}}>
          {I.logout}<span>Se déconnecter</span>
        </button>
      </div>
    </aside>
  );
}

// ---------- Dashboard ----------
function DashboardView() {
  const [stats, setStats] = useState(null);
  const [err, setErr] = useState('');
  useEffect(() => {
    api('/reseller/dashboard').then(setStats).catch(e => setErr(e.message));
  }, []);
  const fmt = (cents, ccy='CHF') => `${(cents/100).toFixed(2)} ${ccy}`;
  return (
    <div>
      <h1 className="page-title">Tableau de bord</h1>
      <p className="page-sub">Aperçu de vos clients et abonnements WhatsApp.</p>
      {err && <div className="error-banner">{err}</div>}
      {!stats ? <div className="loading-spinner" /> : (
        <>
          <div className="stat-grid">
            <div className="stat-tile">
              <div className="stat-label">Clients</div>
              <div className="stat-value">{stats.clients}</div>
            </div>
            <div className="stat-tile">
              <div className="stat-label">Abonnements actifs</div>
              <div className="stat-value">{stats.active_subscriptions}</div>
            </div>
            <div className="stat-tile">
              <div className="stat-label">MRR (revenu)</div>
              <div className="stat-value">{fmt(stats.mrr_cents)}</div>
              <div className="stat-hint">par mois</div>
            </div>
            <div className="stat-tile">
              <div className="stat-label">Coût grossiste</div>
              <div className="stat-value">{fmt(stats.wholesale_cost_cents)}</div>
              <div className="stat-hint">factur&eacute; par Vocal</div>
            </div>
            <div className="stat-tile">
              <div className="stat-label">Marge brute</div>
              <div className="stat-value" style={{color:'var(--brand)'}}>{fmt(stats.margin_cents)}</div>
              <div className="stat-hint">{stats.mrr_cents > 0 ? Math.round((stats.margin_cents/stats.mrr_cents)*100) : 0}% de marge</div>
            </div>
            <div className="stat-tile">
              <div className="stat-label">Messages WA consomm&eacute;s</div>
              <div className="stat-value">{stats.messages_used_period}</div>
              <div className="stat-hint">période en cours</div>
            </div>
          </div>
          <div className="card">
            <h3 className="card-title">Bienvenue 👋</h3>
            <p className="muted" style={{margin:0}}>
              Ajoutez vos clients dans <b>Clients</b>, d&eacute;finissez vos prix dans <b>Packs &amp; tarifs</b>,
              puis renseignez vos cl&eacute;s Stripe dans <b>Stripe</b> pour encaisser vos abonnements WhatsApp.
            </p>
          </div>
        </>
      )}
    </div>
  );
}

// ---------- Clients ----------
function ClientsView() {
  const [clients, setClients] = useState([]);
  const [loading, setLoading] = useState(true);
  const [err, setErr] = useState('');
  const [showCreate, setShowCreate] = useState(false);
  const [form, setForm] = useState({ email: '', company_name: '', first_name: '', last_name: '', phone: '' });
  const [packs, setPacks] = useState([]);

  const load = useCallback(() => {
    setLoading(true);
    api('/reseller/clients').then(d => setClients(d.clients || [])).catch(e => setErr(e.message)).finally(() => setLoading(false));
  }, []);
  useEffect(() => { load(); api('/reseller/packs').then(d => setPacks(d.packs||[])).catch(()=>{}); }, [load]);

  async function createClient(e) {
    e.preventDefault();
    setErr('');
    try {
      await api('/reseller/clients', { method: 'POST', body: JSON.stringify(form) });
      setShowCreate(false);
      setForm({ email: '', company_name: '', first_name: '', last_name: '', phone: '' });
      load();
    } catch (e2) { setErr(e2.message); }
  }

  async function assignPack(clientId, packId) {
    if (!packId) return;
    try {
      await api('/reseller/subscriptions', { method: 'POST', body: JSON.stringify({ client_id: clientId, pack_id: packId }) });
      load();
    } catch (e) { alert(e.message); }
  }

  return (
    <div>
      <div className="between" style={{marginBottom:'1rem'}}>
        <div>
          <h1 className="page-title">Clients</h1>
          <p className="page-sub">Vos clients finaux qui utilisent les services WhatsApp.</p>
        </div>
        <button className="btn btn-primary" onClick={() => setShowCreate(true)}>+ Nouveau client</button>
      </div>
      {err && <div className="error-banner">{err}</div>}
      {loading ? <div className="loading-spinner" /> : clients.length === 0 ? (
        <div className="card"><p className="muted" style={{margin:0}}>Aucun client pour le moment. Cliquez sur <b>+ Nouveau client</b> pour commencer.</p></div>
      ) : (
        <div className="table-wrap">
          <table className="tbl">
            <thead><tr>
              <th>Client</th><th>Email</th><th>Lignes</th><th>Pack actif</th><th>Usage</th><th></th>
            </tr></thead>
            <tbody>
              {clients.map(c => (
                <tr key={c.id}>
                  <td><b>{c.company_name || `${c.first_name||''} ${c.last_name||''}`.trim() || '-'}</b></td>
                  <td>{c.email}</td>
                  <td>{c.lines_count}</td>
                  <td>{c.active_pack ? <span className="badge badge-ok">{packs.find(p=>p.id===c.active_pack)?.label || c.active_pack}</span> : <span className="badge badge-muted">Aucun</span>}</td>
                  <td>{c.messages_used != null && c.messages_quota ? `${c.messages_used} / ${c.messages_quota}` : '-'}</td>
                  <td>
                    <select onChange={e => { assignPack(c.id, e.target.value); e.target.value=''; }} defaultValue="" style={{width:'auto',padding:'0.35rem 0.5rem',fontSize:'0.82rem'}}>
                      <option value="">Assigner un pack...</option>
                      {packs.map(p => <option key={p.id} value={p.id}>{p.label} ({(p.retail_price_cents/100).toFixed(0)} CHF)</option>)}
                    </select>
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      )}

      {showCreate && (
        <div style={{position:'fixed',inset:0,background:'rgba(0,0,0,0.4)',display:'flex',alignItems:'center',justifyContent:'center',zIndex:1000,padding:'1rem'}} onClick={() => setShowCreate(false)}>
          <div className="card" style={{maxWidth:480,width:'100%'}} onClick={e=>e.stopPropagation()}>
            <h3 className="card-title">Nouveau client</h3>
            <form onSubmit={createClient}>
              <div className="form-row"><label>Email *</label><input type="email" required value={form.email} onChange={e=>setForm({...form,email:e.target.value})} /></div>
              <div className="form-row"><label>Société</label><input value={form.company_name} onChange={e=>setForm({...form,company_name:e.target.value})} /></div>
              <div className="row">
                <div className="form-row" style={{flex:1}}><label>Prénom</label><input value={form.first_name} onChange={e=>setForm({...form,first_name:e.target.value})} /></div>
                <div className="form-row" style={{flex:1}}><label>Nom</label><input value={form.last_name} onChange={e=>setForm({...form,last_name:e.target.value})} /></div>
              </div>
              <div className="form-row"><label>Téléphone</label><input value={form.phone} onChange={e=>setForm({...form,phone:e.target.value})} /></div>
              <div className="row" style={{justifyContent:'flex-end',marginTop:'0.5rem'}}>
                <button type="button" className="btn btn-secondary" onClick={() => setShowCreate(false)}>Annuler</button>
                <button type="submit" className="btn btn-primary">Créer</button>
              </div>
            </form>
          </div>
        </div>
      )}
    </div>
  );
}

// ---------- Packs ----------
function PacksView() {
  const [packs, setPacks] = useState([]);
  const [err, setErr] = useState('');
  const [success, setSuccess] = useState('');
  const load = useCallback(() => {
    api('/reseller/packs').then(d => setPacks(d.packs||[])).catch(e => setErr(e.message));
  }, []);
  useEffect(load, [load]);

  async function save(packId, retail, enabled, stripePriceId) {
    setErr(''); setSuccess('');
    try {
      await api(`/reseller/packs/${packId}`, { method: 'PUT', body: JSON.stringify({ retail_price_cents: Math.round(retail*100), is_enabled: enabled, stripe_price_id: stripePriceId||null }) });
      setSuccess('Tarif enregistré ✓');
      load();
      setTimeout(() => setSuccess(''), 2000);
    } catch (e) { setErr(e.message); }
  }

  return (
    <div>
      <h1 className="page-title">Packs &amp; tarifs</h1>
      <p className="page-sub">Définissez vos prix de vente pour chaque pack WhatsApp. Le prix grossiste est ce que Vocal vous facture.</p>
      {err && <div className="error-banner">{err}</div>}
      {success && <div className="success-banner">{success}</div>}
      <div className="pack-grid">
        {packs.map(p => <PackCard key={p.id} p={p} onSave={save} />)}
      </div>
    </div>
  );
}

function PackCard({ p, onSave }) {
  const [retail, setRetail] = useState((p.retail_price_cents/100).toFixed(2));
  const [enabled, setEnabled] = useState(!!p.is_enabled);
  const [stripePriceId, setStripePriceId] = useState(p.stripe_price_id || '');
  const margin = (parseFloat(retail)*100 - p.wholesale_price_cents);
  return (
    <div className="pack-card">
      <div className="between">
        <h4>{p.label}</h4>
        <label style={{display:'flex',alignItems:'center',gap:'0.4rem',fontSize:'0.82rem',color:'var(--text-muted)'}}>
          <input type="checkbox" checked={enabled} onChange={e=>setEnabled(e.target.checked)} /> Actif
        </label>
      </div>
      <div className="pack-quota">{p.messages_quota.toLocaleString()} messages / mois</div>
      <div className="form-row">
        <label>Votre prix de vente ({p.currency})</label>
        <input type="number" step="0.01" min="0" value={retail} onChange={e=>setRetail(e.target.value)} />
        <div className="hint">Prix grossiste Vocal : {(p.wholesale_price_cents/100).toFixed(2)} {p.currency} - Marge : <b style={{color: margin>=0?'#16a34a':'#dc2626'}}>{(margin/100).toFixed(2)} {p.currency}</b></div>
      </div>
      <div className="form-row">
        <label>Stripe Price ID (optionnel)</label>
        <input value={stripePriceId} onChange={e=>setStripePriceId(e.target.value)} placeholder="price_xxx" />
        <div className="hint">Créez un produit dans <b>votre</b> Stripe, puis collez ici son price ID.</div>
      </div>
      <button className="btn btn-primary" style={{width:'100%',justifyContent:'center'}} onClick={() => onSave(p.id, parseFloat(retail), enabled, stripePriceId)}>Enregistrer</button>
    </div>
  );
}

// ---------- Domain wizard ----------
function DomainWizard({ initialHost, onChange }) {
  const [host, setHost] = useState(initialHost || '');
  const [status, setStatus] = useState(null);   // { host, status, cname_ok, cname_target, ... }
  const [loading, setLoading] = useState(false);
  const [busy, setBusy] = useState(false);
  const [err, setErr] = useState('');
  const [msg, setMsg] = useState('');

  const refresh = useCallback(async () => {
    setLoading(true); setErr('');
    try {
      const s = await api('/reseller/domain/status');
      setStatus(s);
      if (s.host && !host) { setHost(s.host); onChange?.(s.host); }
    } catch (e) { setErr(e.message); }
    finally { setLoading(false); }
  }, [host, onChange]);
  useEffect(() => { refresh(); }, []);

  // Re-check toutes les 15s tant qu'on est en verifying/cname_missing
  useEffect(() => {
    if (!status || ['active', 'none'].includes(status.status)) return;
    const t = setInterval(refresh, 15000);
    return () => clearInterval(t);
  }, [status, refresh]);

  async function attach() {
    setErr(''); setMsg(''); setBusy(true);
    try {
      const r = await api('/reseller/domain/attach', { method: 'POST', body: JSON.stringify({ host }) });
      setMsg(r.next || 'Domaine attaché.');
      onChange?.(r.host);
      await refresh();
    } catch (e) { setErr(e.message); }
    finally { setBusy(false); }
  }

  function copy(t) { navigator.clipboard?.writeText(t); setMsg('Copié ✓'); setTimeout(() => setMsg(''), 1500); }

  const target = status?.cname_target || 'ch-vocal-manager.pages.dev';
  const isActive = status?.status === 'active';
  const isVerifying = status?.status === 'verifying';
  const isCnameMissing = status?.status === 'cname_missing';
  const isError = status?.status === 'error';
  const hasHost = !!status?.host;

  return (
    <div>
      <p className="muted" style={{margin:'0 0 1rem'}}>Faites pointer votre propre sous-domaine (ex&nbsp;: <code>manager.votre-agence.ch</code>) sur votre espace.</p>

      {err && <div className="error-banner">{err}</div>}
      {msg && <div className="success-banner">{msg}</div>}

      {/* Étape 1 : saisir le host */}
      {!hasHost && (
        <>
          <div className="form-row">
            <label>Votre sous-domaine</label>
            <input value={host} onChange={e => setHost(e.target.value.toLowerCase().trim())} placeholder="manager.votre-agence.ch" />
          </div>
          <button className="btn btn-primary" disabled={busy || !host} onClick={attach}>
            {busy ? 'Activation…' : 'Activer ce domaine'}
          </button>
        </>
      )}

      {/* Étapes 2/3 : instructions CNAME + statut */}
      {hasHost && (
        <>
          <div className="between" style={{marginBottom:'1rem'}}>
            <div>
              <div style={{fontWeight:700,fontSize:'1.05rem'}}>{status.host}</div>
              <div style={{fontSize:'0.85rem',color:'var(--text-muted)'}}>
                {isActive && <span style={{color:'#16a34a'}}>● Actif - TLS émis - prêt à servir</span>}
                {isVerifying && <span style={{color:'#d97706'}}>● Vérification en cours (TLS en cours d'émission)…</span>}
                {isCnameMissing && <span style={{color:'#d97706'}}>● En attente du CNAME chez votre registrar</span>}
                {isError && <span style={{color:'#dc2626'}}>● Erreur : {status.error}</span>}
              </div>
            </div>
            <div className="row">
              <button className="btn btn-secondary" onClick={refresh} disabled={loading}>{loading ? '…' : 'Vérifier'}</button>
              {isActive && <a className="btn btn-primary" href={`https://${status.host}`} target="_blank" rel="noreferrer">Ouvrir →</a>}
            </div>
          </div>

          {!isActive && (
            <div className="card" style={{background:'#fffbeb',borderColor:'#fde68a',marginBottom:'1rem'}}>
              <div style={{fontWeight:700,marginBottom:'0.5rem'}}>Créez ce CNAME chez votre registrar :</div>
              <table className="tbl" style={{background:'white',border:'1px solid var(--border)',borderRadius:8}}>
                <thead><tr><th>Type</th><th>Nom</th><th>Valeur</th><th></th></tr></thead>
                <tbody>
                  <tr>
                    <td><code>CNAME</code></td>
                    <td><code>{status.host.split('.').slice(0,-2).join('.') || status.host}</code></td>
                    <td><code>{target}</code></td>
                    <td><button className="btn btn-ghost" onClick={() => copy(target)} title="Copier">{I.copy}</button></td>
                  </tr>
                </tbody>
              </table>
              <div className="muted" style={{marginTop:'0.6rem',fontSize:'0.85rem'}}>
                Une fois le CNAME en place, la vérification est automatique (toutes les 15s).
                Le certificat TLS est ensuite émis automatiquement par Cloudflare (1-5 min).
              </div>
              {status.cname_answers?.length > 0 && (
                <div className="muted" style={{marginTop:'0.5rem',fontSize:'0.8rem'}}>
                  Actuellement, votre DNS répond&nbsp;: <code>{status.cname_answers.join(', ')}</code>
                </div>
              )}
            </div>
          )}

          {isActive && (
            <div className="card" style={{background:'#f0fdf4',borderColor:'#bbf7d0'}}>
              <div style={{fontWeight:700,color:'#166534'}}>✓ Tout est prêt</div>
              <div className="muted">Vos clients peuvent maintenant accéder à votre espace via <a href={`https://${status.host}`} target="_blank" rel="noreferrer"><b>https://{status.host}</b></a>.</div>
            </div>
          )}
        </>
      )}
    </div>
  );
}

// ---------- Branding ----------
function BrandingView({ me, reload }) {
  const r = me.reseller || {};
  const [form, setForm] = useState({
    brand_name: r.brand_name || '',
    logo_url: r.logo_url || '',
    favicon_url: r.favicon_url || '',
    primary_color: r.primary_color || '#6366f1',
    accent_color: r.accent_color || '',
    support_email: r.support_email || '',
    support_phone: r.support_phone || '',
    email_from: r.email_from || '',
    email_from_name: r.email_from_name || '',
    host: r.host || '',
  });
  const [err, setErr] = useState('');
  const [success, setSuccess] = useState('');

  async function save(e) {
    e.preventDefault();
    setErr(''); setSuccess('');
    try {
      await api('/reseller/branding', { method: 'PUT', body: JSON.stringify(form) });
      setSuccess('Image de marque enregistrée ✓');
      reload?.();
      setTimeout(() => setSuccess(''), 2000);
    } catch (e2) { setErr(e2.message); }
  }

  return (
    <div>
      <h1 className="page-title">Image de marque</h1>
      <p className="page-sub">Personnalisez l'apparence du manager et des apps clients vues par vos clients finaux.</p>
      {err && <div className="error-banner">{err}</div>}
      {success && <div className="success-banner">{success}</div>}
      <form onSubmit={save} style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:'1rem',maxWidth:900}}>
        <div className="card" style={{gridColumn:'1 / -1'}}>
          <h3 className="card-title">Identité</h3>
          <div className="form-row"><label>Nom de marque</label><input value={form.brand_name} onChange={e=>setForm({...form,brand_name:e.target.value})} placeholder="Mon Agence" /></div>
          <div className="row" style={{alignItems:'flex-start'}}>
            <div className="form-row" style={{flex:1}}>
              <label>Logo (URL)</label>
              <input value={form.logo_url} onChange={e=>setForm({...form,logo_url:e.target.value})} placeholder="https://..." />
              <div className="hint">SVG/PNG transparent recommandé, hauteur 56px min.</div>
            </div>
            <div className="form-row" style={{flex:1}}>
              <label>Favicon (URL)</label>
              <input value={form.favicon_url} onChange={e=>setForm({...form,favicon_url:e.target.value})} placeholder="https://..." />
            </div>
          </div>
          <div className="row">
            <div className="form-row" style={{flex:1}}>
              <label>Couleur primaire</label>
              <div className="row">
                <input type="color" value={form.primary_color} onChange={e=>setForm({...form,primary_color:e.target.value})} style={{width:50,height:38,padding:2}} />
                <input value={form.primary_color} onChange={e=>setForm({...form,primary_color:e.target.value})} />
              </div>
            </div>
            <div className="form-row" style={{flex:1}}>
              <label>Couleur accent (optionnel)</label>
              <div className="row">
                <input type="color" value={form.accent_color || '#8b5cf6'} onChange={e=>setForm({...form,accent_color:e.target.value})} style={{width:50,height:38,padding:2}} />
                <input value={form.accent_color} onChange={e=>setForm({...form,accent_color:e.target.value})} />
              </div>
            </div>
          </div>
        </div>

        <div className="card">
          <h3 className="card-title">Contact &amp; support</h3>
          <div className="form-row"><label>Email support</label><input type="email" value={form.support_email} onChange={e=>setForm({...form,support_email:e.target.value})} placeholder="support@..." /></div>
          <div className="form-row"><label>Téléphone support</label><input value={form.support_phone} onChange={e=>setForm({...form,support_phone:e.target.value})} /></div>
        </div>

        <div className="card">
          <h3 className="card-title">Emails sortants</h3>
          <div className="form-row"><label>Email expéditeur</label><input value={form.email_from} onChange={e=>setForm({...form,email_from:e.target.value})} placeholder="noreply@votre-agence.ch" /><div className="hint">Le domaine doit être validé.</div></div>
          <div className="form-row"><label>Nom expéditeur</label><input value={form.email_from_name} onChange={e=>setForm({...form,email_from_name:e.target.value})} placeholder="Mon Agence" /></div>
        </div>

        <div className="card" style={{gridColumn:'1 / -1'}}>
          <h3 className="card-title">Domaine personnalisé</h3>
          <DomainWizard initialHost={form.host} onChange={(h) => setForm(f => ({...f, host: h}))} />
        </div>

        <div style={{gridColumn:'1 / -1'}}>
          <button type="submit" className="btn btn-primary">Enregistrer</button>
        </div>
      </form>
    </div>
  );
}

// ---------- Stripe ----------
function StripeView() {
  const [data, setData] = useState(null);
  const [secret, setSecret] = useState('');
  const [pub, setPub] = useState('');
  const [wh, setWh] = useState('');
  const [err, setErr] = useState('');
  const [success, setSuccess] = useState('');
  const load = useCallback(() => api('/reseller/stripe').then(d => { setData(d); setPub(d.publishable_key||''); }).catch(e => setErr(e.message)), []);
  useEffect(load, [load]);

  async function save() {
    setErr(''); setSuccess('');
    const body = { publishable_key: pub };
    if (secret) body.secret_key = secret;
    if (wh) body.webhook_secret = wh;
    try {
      await api('/reseller/stripe', { method: 'PUT', body: JSON.stringify(body) });
      setSecret(''); setWh('');
      setSuccess('Clés enregistrées ✓');
      load();
      setTimeout(() => setSuccess(''), 2000);
    } catch (e) { setErr(e.message); }
  }

  function copy(text) { navigator.clipboard?.writeText(text); }

  if (!data) return <div className="loading-spinner" />;
  return (
    <div>
      <h1 className="page-title">Configuration Stripe</h1>
      <p className="page-sub">Vos propres clés Stripe : vous encaissez directement vos clients.</p>
      {err && <div className="error-banner">{err}</div>}
      {success && <div className="success-banner">{success}</div>}
      <div className="card" style={{maxWidth:700}}>
        <h3 className="card-title">Clés API</h3>
        <div className="form-row">
          <label>Publishable key (pk_live_...)</label>
          <input value={pub} onChange={e=>setPub(e.target.value)} placeholder="pk_live_..." />
        </div>
        <div className="form-row">
          <label>Secret key (sk_live_...) {data.has_secret_key && <span className="badge badge-ok" style={{marginLeft:8}}>configurée</span>}</label>
          <input value={secret} onChange={e=>setSecret(e.target.value)} placeholder={data.has_secret_key ? '••••••• (laisser vide pour conserver)' : 'sk_live_...'} type="password" />
        </div>
        <div className="form-row">
          <label>Webhook signing secret (whsec_...) {data.has_webhook_secret && <span className="badge badge-ok" style={{marginLeft:8}}>configurée</span>}</label>
          <input value={wh} onChange={e=>setWh(e.target.value)} placeholder={data.has_webhook_secret ? '••••••• (laisser vide pour conserver)' : 'whsec_...'} type="password" />
        </div>
        <button className="btn btn-primary" onClick={save}>Enregistrer</button>
      </div>

      <div className="card" style={{maxWidth:700,marginTop:'1.5rem'}}>
        <h3 className="card-title">Webhook à configurer dans Stripe</h3>
        <p className="muted">Dans votre Dashboard Stripe &gt; Developers &gt; Webhooks, ajoutez un endpoint :</p>
        <div className="row" style={{background:'#f1f5f9',padding:'0.75rem 1rem',borderRadius:8,fontFamily:'monospace',fontSize:'0.85rem'}}>
          <span style={{flex:1,wordBreak:'break-all'}}>{data.webhook_url}</span>
          <button className="btn btn-ghost" onClick={() => copy(data.webhook_url)} title="Copier">{I.copy}</button>
        </div>
        <p className="muted" style={{marginTop:'0.75rem'}}>Événements à écouter : <code>customer.subscription.created</code>, <code>customer.subscription.updated</code>, <code>customer.subscription.deleted</code>, <code>invoice.payment_succeeded</code>, <code>invoice.payment_failed</code>.</p>
        <p className="muted">Récupérez le <b>signing secret</b> (whsec_...) et collez-le ci-dessus.</p>
      </div>
    </div>
  );
}

// ---------- Root ----------
function App() {
  const [branding, setBranding] = useState(null);
  const [me, setMe] = useState(null);
  const [loading, setLoading] = useState(true);
  const [page, setPage] = useState('dashboard');

  useEffect(() => {
    // Branding (par host)
    fetch(`${API}/v1/branding?host=${encodeURIComponent(location.host)}`)
      .then(r => r.json()).then(b => {
        setBranding(b);
        if (b.primary_color) document.documentElement.style.setProperty('--brand', b.primary_color);
        if (b.accent_color)  document.documentElement.style.setProperty('--brand-light', b.accent_color);
        if (b.brand_name)    document.title = `${b.brand_name} - Espace revendeur`;
        const tc = document.getElementById('theme-color-tag');
        if (tc && b.primary_color) tc.setAttribute('content', b.primary_color);
        if (b.favicon_url) {
          const fav = document.getElementById('favicon');
          if (fav) fav.setAttribute('href', b.favicon_url);
        }
      }).catch(()=>{});

    // Session
    if (localStorage.getItem(TOKEN_KEY)) {
      api('/reseller/me').then(setMe).catch(() => { localStorage.removeItem(TOKEN_KEY); }).finally(() => setLoading(false));
    } else {
      setLoading(false);
    }
  }, []);

  function logout() {
    api('/reseller/logout', { method: 'POST' }).catch(()=>{});
    localStorage.removeItem(TOKEN_KEY);
    setMe(null);
  }

  function reloadMe() { api('/reseller/me').then(setMe).catch(()=>{}); }

  if (loading) return <div className="loading-spinner" style={{margin:'4rem auto'}} />;
  if (!me) return <AuthScreen branding={branding} onAuth={setMe} />;

  return (
    <div className="app-shell">
      <Sidebar current={page} onNav={setPage} me={me} branding={branding} onLogout={logout} />
      <main className="main">
        {page === 'dashboard' && <DashboardView />}
        {page === 'clients' && <ClientsView />}
        {page === 'packs' && <PacksView />}
        {page === 'branding' && <BrandingView me={me} reload={reloadMe} />}
        {page === 'stripe' && <StripeView />}
      </main>
    </div>
  );
}

const root = ReactDOM.createRoot(document.getElementById('app'));
root.render(<App />);
