function AuthShell({ title, subtitle, children, wide }) {
  return (
    <div className="auth-shell">
      <aside className="auth-aside" style={{ position: 'relative', overflow: 'hidden' }}>
        {/* Dekoratives Sicherheits-Motiv */}
        <svg viewBox="0 0 400 620" preserveAspectRatio="xMidYMid slice" aria-hidden="true"
          style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', zIndex: 0 }}>
          <defs>
            <radialGradient id="authGlow" cx="72%" cy="20%" r="65%">
              <stop offset="0%" stopColor="#34d399" stopOpacity="0.32" />
              <stop offset="100%" stopColor="#34d399" stopOpacity="0" />
            </radialGradient>
            <radialGradient id="authGlow2" cx="18%" cy="92%" r="55%">
              <stop offset="0%" stopColor="#3b82f6" stopOpacity="0.22" />
              <stop offset="100%" stopColor="#3b82f6" stopOpacity="0" />
            </radialGradient>
            <pattern id="authDots" width="26" height="26" patternUnits="userSpaceOnUse">
              <circle cx="2" cy="2" r="1.3" fill="#ffffff" fillOpacity="0.06" />
            </pattern>
          </defs>
          <rect width="400" height="620" fill="url(#authDots)" />
          <rect width="400" height="620" fill="url(#authGlow)" />
          <rect width="400" height="620" fill="url(#authGlow2)" />
          <g transform="translate(200 320)" fill="none" stroke="#ffffff" strokeOpacity="0.14" strokeWidth="6" strokeLinecap="round" strokeLinejoin="round">
            <rect x="-72" y="-14" width="144" height="128" rx="20" />
            <path d="M-42 -14 v-34 a42 42 0 0 1 84 0 v34" />
          </g>
          <g transform="translate(200 320)">
            <circle cx="0" cy="34" r="15" fill="#34d399" fillOpacity="0.55" />
            <rect x="-5" y="40" width="10" height="34" rx="5" fill="#34d399" fillOpacity="0.55" />
          </g>
        </svg>

        <div style={{ position: 'relative', zIndex: 1, display: 'flex', alignItems: 'center', gap: 10, fontWeight: 600, color: 'white' }}>
          <span className="brand-mark"><Icon name="lock-check" size={16} /></span>
          ReadySSL
        </div>
        <div style={{ marginTop: 'auto', position: 'relative', zIndex: 1 }}>
          <h2 style={{ fontSize: 32, color: 'white', maxWidth: 380 }}>Ihre Domain. Immer sicher.</h2>
          <p className="lead">Einrichtung und Monitoring kostenloser Let's Encrypt SSL-Zertifikate — als verlässliche Dienstleistung.</p>
          <ul>
            <li><Icon name="check" size={16} /> Prüfung alle 40 Tage</li>
            <li><Icon name="check" size={16} /> Benachrichtigung bei Problemen</li>
            <li><Icon name="check" size={16} /> Status-Historie im Dashboard</li>
            <li><Icon name="check" size={16} /> 2-Faktor-Login per E-Mail</li>
          </ul>
        </div>
        <div className="mono" style={{ marginTop: 32, position: 'relative', zIndex: 1, fontSize: 12, color: 'oklch(0.7 0.02 250)' }}>
          VITALARISTA LLC · Abrechnung ohne MwSt.
        </div>
      </aside>
      <div className="auth-main">
        <div className="auth-card" style={wide ? { maxWidth: 560 } : undefined}>
          <Link to="/" className="btn btn-ghost btn-sm" style={{ marginBottom: 18, paddingLeft: 0 }}>
            <Icon name="arrow-right" size={13} style={{ transform: 'rotate(180deg)' }} /> Zurück zur Startseite
          </Link>
          <h2>{title}</h2>
          <p className="lead">{subtitle}</p>
          {children}
        </div>
      </div>
    </div>
  );
}

function LoginPage() {
  const { go } = useRouter();
  const { sendLoginCode, showToast } = useApp();
  const [email, setEmail] = useState('');
  const [loading, setLoading] = useState(false);
  const valid = /\S+@\S+\.\S+/.test(email);

  const submit = async (e) => {
    e.preventDefault();
    if (!valid || loading) return;
    setLoading(true);
    const { error } = await sendLoginCode(email);
    setLoading(false);
    if (error) { showToast(error.message || 'Anmeldung fehlgeschlagen.'); return; }
    sessionStorage.setItem('cg.authEmail', email);
    sessionStorage.removeItem('cg.pendingProfile');
    go('/verify');
  };

  return (
    <AuthShell title="Anmelden" subtitle="Geben Sie Ihre E-Mail-Adresse ein — wir senden Ihnen einen Anmelde-Code.">
      <form className="stack-4" onSubmit={submit}>
        <div className="field">
          <label className="label">E-Mail-Adresse</label>
          <input className="input" type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="kontakt@firma.de" />
        </div>
        <button className="btn btn-primary btn-block btn-lg" type="submit" disabled={!valid || loading}>
          {loading ? 'Code wird gesendet …' : <React.Fragment>Code anfordern <Icon name="arrow-right" size={14} /></React.Fragment>}
        </button>

        <div className="callout">
          <Icon name="shield-check" size={16} />
          <div>Kein Passwort nötig — Sie melden sich mit einem einmaligen 6-stelligen Code an, den wir per E-Mail senden.</div>
        </div>

        <div style={{ textAlign: 'center', fontSize: 14, color: 'var(--muted)' }}>
          Noch kein Konto? <Link to="/register" style={{ color: 'var(--navy-700)', fontWeight: 500 }}>Jetzt registrieren</Link>
        </div>
      </form>
    </AuthShell>
  );
}

function RegisterPage() {
  const { go } = useRouter();
  const { registerCompany, showToast } = useApp();
  const [d, setD] = useState({
    companyName: '', form: 'GmbH', vat: '',
    street: '', zip: '', city: '', country: 'Deutschland',
    first: '', last: '', email: '', phone: '',
    agree: false,
  });
  const [loading, setLoading] = useState(false);
  const [step, setStep] = useState(1);
  const set = (k, v) => setD((p) => ({ ...p, [k]: v }));

  const step1ok = !!d.companyName.trim();
  const step3ok = d.first.trim() && d.last.trim() && /\S+@\S+\.\S+/.test(d.email) && d.agree;
  const valid = step1ok && step3ok;

  const submit = async (e) => {
    e.preventDefault();
    if (!valid || loading) return;
    setLoading(true);
    const { error } = await registerCompany(d);
    setLoading(false);
    if (error) { showToast(error.message || 'Registrierung fehlgeschlagen.'); return; }
    go('/verify');
  };

  const stepLabels = ['Firma', 'Anschrift', 'Zugang'];

  return (
    <AuthShell
      title="Firma registrieren"
      subtitle="Erstellen Sie Ihr Firmenkonto in drei kurzen Schritten."
      wide
    >
      <form className="stack-6" onSubmit={submit}>
        {/* Schritt-Anzeige */}
        <div style={{ display: 'flex', gap: 8 }}>
          {stepLabels.map((label, i) => {
            const n = i + 1;
            const active = step === n;
            const done = step > n;
            return (
              <div key={label} style={{ flex: 1 }}>
                <div style={{ display: 'flex', alignItems: 'center', gap: 8, justifyContent: 'center' }}>
                  <span style={{ width: 26, height: 26, borderRadius: '50%', display: 'grid', placeItems: 'center', fontSize: 13, fontWeight: 600, background: active ? 'var(--navy-900)' : done ? 'var(--green-soft)' : 'var(--surface-2)', color: active ? '#fff' : done ? 'var(--green-ink)' : 'var(--muted)' }}>{done ? '✓' : n}</span>
                  <span style={{ fontSize: 13, fontWeight: active ? 600 : 400, color: active ? 'var(--ink)' : 'var(--muted)' }}>{label}</span>
                </div>
                <div style={{ height: 3, borderRadius: 3, marginTop: 8, background: (done || active) ? 'var(--navy-700)' : 'var(--border)' }} />
              </div>
            );
          })}
        </div>

        {step === 1 ? (
          <div>
            <div className="reg-legend">Firmendaten</div>
            <div className="field"><label className="label">Firmenname</label>
              <input className="input" value={d.companyName} onChange={(e) => set('companyName', e.target.value)} placeholder="z. B. Muster Handels GmbH" />
            </div>
            <div className="field-row cols-2" style={{ marginTop: 14 }}>
              <div className="field"><label className="label">Rechtsform</label>
                <select className="select" value={d.form} onChange={(e) => set('form', e.target.value)}>
                  <option>GmbH</option><option>UG (haftungsbeschränkt)</option><option>AG</option><option>OHG</option><option>KG</option><option>GmbH &amp; Co. KG</option><option>e.K.</option><option>GbR</option><option>Einzelunternehmer</option><option>Freiberufler</option><option>Verein / e.V.</option>
                </select>
              </div>
              <div className="field"><label className="label">USt-ID / Steuernummer <span className="opt">optional</span></label>
                <input className="input mono" value={d.vat} onChange={(e) => set('vat', e.target.value)} placeholder="DE123456789" />
              </div>
            </div>
          </div>
        ) : null}

        {step === 2 ? (
          <div>
            <div className="reg-legend">Firmenanschrift</div>
            <div className="field-row cols-2" style={{ gridTemplateColumns: '2fr 1fr' }}>
              <div className="field"><label className="label">Straße &amp; Hausnummer</label><input className="input" value={d.street} onChange={(e) => set('street', e.target.value)} placeholder="Hauptstraße 24" /></div>
              <div className="field"><label className="label">PLZ</label><input className="input" value={d.zip} onChange={(e) => set('zip', e.target.value)} placeholder="10115" /></div>
            </div>
            <div className="field-row cols-2" style={{ marginTop: 14 }}>
              <div className="field"><label className="label">Ort</label><input className="input" value={d.city} onChange={(e) => set('city', e.target.value)} placeholder="Berlin" /></div>
              <div className="field"><label className="label">Land</label>
                <select className="select" value={d.country} onChange={(e) => set('country', e.target.value)}>
                  <option>Deutschland</option><option>Österreich</option><option>Schweiz</option><option>Luxemburg</option>
                </select>
              </div>
            </div>
          </div>
        ) : null}

        {step === 3 ? (
          <div>
            <div className="reg-legend">Ansprechpartner &amp; Zugang</div>
            <div className="field-row cols-2">
              <div className="field"><label className="label">Vorname</label><input className="input" value={d.first} onChange={(e) => set('first', e.target.value)} placeholder="Vorname" /></div>
              <div className="field"><label className="label">Name</label><input className="input" value={d.last} onChange={(e) => set('last', e.target.value)} placeholder="Nachname" /></div>
            </div>
            <div className="field-row cols-2" style={{ marginTop: 14 }}>
              <div className="field"><label className="label">E-Mail-Adresse</label><input className="input" type="email" value={d.email} onChange={(e) => set('email', e.target.value)} placeholder="kontakt@firma.de" /></div>
              <div className="field"><label className="label">Telefon <span className="opt">optional</span></label><input className="input" value={d.phone} onChange={(e) => set('phone', e.target.value)} placeholder="+49 …" /></div>
            </div>
            <label className="check" style={{ marginTop: 16 }}>
              <input type="checkbox" checked={d.agree} onChange={(e) => set('agree', e.target.checked)} />
              <span>Ich akzeptiere die <Link to="/agb" style={{ textDecoration: 'underline' }}>AGB</Link> und <Link to="/datenschutz" style={{ textDecoration: 'underline' }}>Datenschutzerklärung</Link>.</span>
            </label>
          </div>
        ) : null}

        {/* Navigation */}
        <div className="row-between">
          {step > 1
            ? <button type="button" className="btn btn-ghost" onClick={() => setStep(step - 1)}><Icon name="arrow-right" size={14} style={{ transform: 'rotate(180deg)' }} /> Zurück</button>
            : <span />}
          {step < 3
            ? <button type="button" className="btn btn-primary" disabled={step === 1 && !step1ok} onClick={() => setStep(step + 1)}>Weiter <Icon name="arrow-right" size={14} /></button>
            : <button type="submit" className="btn btn-primary" disabled={!valid || loading}>{loading ? 'Code wird gesendet …' : <React.Fragment>Firmenkonto erstellen <Icon name="arrow-right" size={14} /></React.Fragment>}</button>}
        </div>

        <div style={{ textAlign: 'center', fontSize: 14, color: 'var(--muted)' }}>
          Bereits registriert? <Link to="/login" style={{ color: 'var(--navy-700)', fontWeight: 500 }}>Anmelden</Link>
        </div>
      </form>
    </AuthShell>
  );
}

function ForgotPage() {
  const [sent, setSent] = useState(false);
  return (
    <AuthShell title="Passwort vergessen" subtitle="Wir senden Ihnen einen Link zum Zurücksetzen Ihres Passworts.">
      {sent ? (
        <div className="callout callout-success">
          <Icon name="check-circle" size={16} />
          <div>E-Mail wurde versendet. Bitte prüfen Sie Ihren Posteingang.</div>
        </div>
      ) : (
        <form className="stack-4" onSubmit={(e) => { e.preventDefault(); setSent(true); }}>
          <div className="field"><label className="label">E-Mail-Adresse</label><input className="input" type="email" defaultValue="thomas.weber@meine-firma.de" /></div>
          <button className="btn btn-primary btn-block btn-lg" type="submit">Link senden</button>
        </form>
      )}
      <div style={{ textAlign: 'center', fontSize: 14, color: 'var(--muted)', marginTop: 20 }}>
        <Link to="/login" style={{ color: 'var(--navy-700)', fontWeight: 500 }}>Zurück zum Login</Link>
      </div>
    </AuthShell>
  );
}

function VerifyPage() {
  const { go } = useRouter();
  const { verifyCode, resendCode, showToast } = useApp();
  const email = (typeof sessionStorage !== 'undefined' && sessionStorage.getItem('cg.authEmail')) || '';
  const [vals, setVals] = useState(['', '', '', '', '', '']);
  const [loading, setLoading] = useState(false);
  const [seconds, setSeconds] = useState(120);
  const refs = useRef([]);

  useEffect(() => { if (!email) go('/login'); }, []);

  // Countdown (2 Minuten), bis ein neuer Code angefordert werden kann
  useEffect(() => {
    if (seconds <= 0) return undefined;
    const t = setTimeout(() => setSeconds((s) => s - 1), 1000);
    return () => clearTimeout(t);
  }, [seconds]);

  const resend = async () => {
    if (seconds > 0) return;
    const { error } = await resendCode(email);
    if (error) { showToast(error.message || 'Code konnte nicht gesendet werden.'); return; }
    setSeconds(120);
    setVals(['', '', '', '', '', '']);
    showToast('Neuer Code gesendet.');
  };

  const submitCode = async () => {
    const token = vals.join('');
    if (token.length !== 6 || loading) return;
    setLoading(true);
    const { error } = await verifyCode(email, token);
    setLoading(false);
    if (error) { showToast(error.message || 'Code ungültig oder abgelaufen.'); return; }
    go('/dashboard');
  };

  const maskEmail = (e) => {
    if (!e || !e.includes('@')) return e || '';
    const [name, dom] = e.split('@');
    return `${name.slice(0, 1)}••••@${dom}`;
  };

  const setAt = (i, v) => {
    if (v.length > 1) v = v.slice(-1);
    const next = [...vals]; next[i] = v.replace(/[^0-9]/g, ''); setVals(next);
    if (v && i < 5) refs.current[i + 1]?.focus();
  };
  const handleKey = (i, e) => {
    if (e.key === 'Backspace' && !vals[i] && i > 0) refs.current[i - 1]?.focus();
  };
  const complete = vals.every((v) => v !== '');

  return (
    <AuthShell title="E-Mail-Code eingeben" subtitle="Wir haben einen 6-stelligen Verifizierungscode an Ihre E-Mail-Adresse gesendet.">
      <div className="card" style={{ background: 'var(--surface)', border: '1px dashed var(--border)', marginBottom: 24 }}>
        <div className="row" style={{ gap: 10 }}>
          <Icon name="mail" size={18} />
          <span style={{ fontSize: 13.5 }}>Code gesendet an <strong>{maskEmail(email)}</strong></span>
        </div>
        <div className="mono" style={{ fontSize: 11, color: 'var(--muted)', marginTop: 10 }}>
          Bitte den 6-stelligen Code aus der E-Mail eingeben.
        </div>
      </div>

      <div className="otp-row">
        {vals.map((v, i) => (
          <input
            key={i}
            ref={(el) => (refs.current[i] = el)}
            className="otp-box"
            value={v}
            onChange={(e) => setAt(i, e.target.value)}
            onKeyDown={(e) => handleKey(i, e)}
            inputMode="numeric"
            maxLength={1}
          />
        ))}
      </div>

      <button
        className="btn btn-primary btn-block btn-lg"
        style={{ marginTop: 24 }}
        disabled={!complete || loading}
        onClick={submitCode}
      >
        {loading ? 'Wird geprüft …' : <React.Fragment>Bestätigen &amp; anmelden <Icon name="arrow-right" size={14} /></React.Fragment>}
      </button>

      <div style={{ textAlign: 'center', fontSize: 14, color: 'var(--muted)', marginTop: 20 }}>
        {seconds > 0
          ? <span>Neuen Code anfordern in <strong className="mono">{Math.floor(seconds / 60)}:{String(seconds % 60).padStart(2, '0')}</strong></span>
          : <span>Keine E-Mail erhalten? <a href="#" style={{ color: 'var(--navy-700)', fontWeight: 500 }} onClick={(e) => { e.preventDefault(); resend(); }}>Neuen Code anfordern</a></span>}
      </div>
    </AuthShell>
  );
}

window.LoginPage = LoginPage;
window.RegisterPage = RegisterPage;
window.ForgotPage = ForgotPage;
window.VerifyPage = VerifyPage;
