/* global React, Icon, Logo, SMAuth */
const { useState: useStateAuth, useRef: useRefAuth, useEffect: useEffectAuth } = React;
// SMAuth is defined globally by supabase-client.js

function AuthSide({ mode }) {
  const isLogin = mode === 'login';
  return (
    <aside className="auth-side">
      <div className="auth-side__brand" style={{display:'flex', alignItems:'center'}}>
        <img src="logo.svg" alt="SMCUBA" style={{height:38, width:'auto', filter:'brightness(0) invert(1)'}} />
      </div>

      <div className="auth-side__content">
        <span className="auth-side__eyebrow">
          <span className="auth-side__eyebrow-dot"/> +250,000 familias conectadas
        </span>
        <h2 className="auth-side__headline" key={mode} style={{animation:'authFadeIn .35s ease'}}>
          {isLogin
            ? <>Bienvenido de <em>vuelta</em>.<br/>Tu familia te espera.</>
            : <>Crea tu cuenta y <em>conecta</em> con los tuyos.</>}
        </h2>
        <p className="auth-side__sub" key={'p'+mode} style={{animation:'authFadeIn .35s ease'}}>
          {isLogin
            ? 'Entra en tu cuenta para enviar recargas al instante, ver tu historial y gestionar contactos.'
            : 'Regístrate gratis en menos de un minuto. Sin suscripciones, sin letras pequeñas.'}
        </p>
        <ul className="auth-side__bullets">
          <li className="auth-side__bullet">
            <div className="auth-side__bullet-icon"><Icon.Bolt /></div>
            Recargas en menos de 60 segundos
          </li>
          <li className="auth-side__bullet">
            <div className="auth-side__bullet-icon"><Icon.Shield width="16" height="16" /></div>
            Pagos cifrados SSL · PCI-DSS
          </li>
          <li className="auth-side__bullet">
            <div className="auth-side__bullet-icon"><Icon.Heart width="16" height="16" /></div>
            Guarda tus contactos favoritos
          </li>
        </ul>
      </div>

      <div className="auth-side__proof">
        <div className="auth-side__proof-avatars">
          <div className="auth-side__proof-avatar">M</div>
          <div className="auth-side__proof-avatar" style={{background:'linear-gradient(135deg,#FFB74D,#FF9800)'}}>Y</div>
          <div className="auth-side__proof-avatar" style={{background:'linear-gradient(135deg,#8B7EFF,#4F3DF5)'}}>C</div>
        </div>
        <div className="auth-side__proof-text">
          <strong>4.9 ★ de +12,400 reseñas</strong>
          <span>"Llegó en 20 segundos a mi mamá"</span>
        </div>
      </div>
    </aside>
  );
}

function SocialButtons() {
  const [loading, setLoading] = useStateAuth(false);
  const [error,   setError]   = useStateAuth('');

  const handleGoogle = async () => {
    setError(''); setLoading(true);
    const r = await SMAuth.loginWithGoogle();
    // Si hay error muéstralo; si ok el browser se redirige solo a Google
    if (!r.ok) { setError(r.error); setLoading(false); }
    // En éxito Supabase redirige al browser → no hacemos nada más aquí
  };

  return (
    <div style={{marginBottom: 20}}>
      <button
        className="auth-social auth-social--google"
        type="button"
        onClick={handleGoogle}
        disabled={loading}
        style={{width:'100%', opacity: loading ? .7 : 1}}
      >
        {loading
          ? <span style={{display:'flex',alignItems:'center',gap:10}}>
              <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round"><path d="M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83"/></svg>
              Conectando con Google…
            </span>
          : <span style={{display:'flex',alignItems:'center',gap:10}}>
              <svg width="18" height="18" viewBox="0 0 24 24">
                <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
                <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
                <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
                <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
              </svg>
              Continuar con Google
            </span>
        }
      </button>
      {error && (
        <div style={{color:'#c62828',background:'#ffebee',padding:'9px 14px',borderRadius:10,fontSize:13,marginTop:10,textAlign:'center'}}>
          {error}
        </div>
      )}
    </div>
  );
}

// Segmented control shared by both forms — toggles mode in-place.
function AuthSeg({ mode, onChange }) {
  return (
    <div className="auth-seg">
      <div className="auth-seg__indicator" style={{left: mode==='login' ? '4px' : 'calc(50% + 0px)', transition:'left .32s cubic-bezier(.4,0,.2,1)'}}/>
      <button type="button" className={`auth-seg__btn ${mode==='login'?'auth-seg__btn--active':''}`} onClick={()=>onChange('login')}>Iniciar sesión</button>
      <button type="button" className={`auth-seg__btn ${mode==='register'?'auth-seg__btn--active':''}`} onClick={()=>onChange('register')}>Crear cuenta</button>
    </div>
  );
}

// ========== LOGIN FORM (inner) ==========
function LoginForm({ mode, onSwitch }) {
  const [showPw, setShowPw] = useStateAuth(false);
  const [email, setEmail] = useStateAuth('');
  const [password, setPassword] = useStateAuth('');
  const [error, setError] = useStateAuth('');
  const [loading, setLoading] = useStateAuth(false);
  const onSubmit = async (e) => {
    e.preventDefault();
    setError(''); setLoading(true);
    try {
      const r = await SMAuth.login(email.trim(), password);
      if (r.ok) {
        // Restore pending recharge if user was redirected from the homepage form
        const pending = localStorage.getItem('sm_recarga');
        window.location.href = pending ? 'dashboard.html#nueva' : 'dashboard.html';
        return;
      }
      setError(r.error);
      if (r.redirect) setTimeout(()=>window.location.href=r.redirect, 1500);
    } finally { setLoading(false); }
  };
  return (
    <form className="auth-form" onSubmit={onSubmit}>
      <h1 className="auth-form__title">Entrar a tu <em>cuenta</em></h1>
      <p className="auth-form__sub">Usa tu correo o continúa con un servicio externo.</p>

      <AuthSeg mode={mode} onChange={onSwitch} />

      <SocialButtons />
      <div className="auth-divider">o con tu correo</div>

      <div className="auth-field">
        <label className="auth-field__label">Correo electrónico</label>
        <div className="auth-input-wrap">
          <Icon.Mail />
          <input className="auth-input" type="email" required placeholder="tu@correo.com" value={email} onChange={e=>setEmail(e.target.value)} />
        </div>
      </div>

      <div className="auth-field">
        <label className="auth-field__label">
          Contraseña
          <a href="forgot.html">¿Olvidaste tu contraseña?</a>
        </label>
        <div className="auth-input-wrap">
          <Icon.Lock />
          <input className="auth-input" type={showPw?'text':'password'} required placeholder="••••••••" value={password} onChange={e=>setPassword(e.target.value)} />
          <button type="button" className="auth-input-toggle" onClick={()=>setShowPw(!showPw)}>{showPw?'Ocultar':'Mostrar'}</button>
        </div>
      </div>

      {error && <div style={{color:'#c62828', background:'#ffebee', padding:'10px 14px', borderRadius:10, fontSize:13, marginBottom:14}}>{error}</div>}

      <div className="auth-row">
        <label className="auth-check">
          <input type="checkbox" defaultChecked />
          <span className="auth-check__box"><Icon.Check width="12" height="12" /></span>
          Recordarme 30 días
        </label>
      </div>

      <button type="submit" className="auth-submit" disabled={loading}>
        {loading ? 'Entrando…' : <>Entrar <Icon.Arrow /></>}
      </button>

      <p className="auth-swap">
        ¿No tienes cuenta? <a href="#" onClick={e=>{e.preventDefault(); onSwitch('register');}}>Crea una gratis</a>
      </p>
    </form>
  );
}

// ========== REGISTER FORM (inner) ==========
function RegisterForm({ mode, onSwitch }) {
  const [pw, setPw] = useStateAuth('');
  const [showPw, setShowPw] = useStateAuth(false);
  const [firstName, setFirstName] = useStateAuth('');
  const [lastName, setLastName] = useStateAuth('');
  const [email, setEmail] = useStateAuth('');
  const [error, setError] = useStateAuth('');

  const rules = {
    length: pw.length >= 8,
    upper: /[A-Z]/.test(pw),
    number: /[0-9]/.test(pw),
    symbol: /[^A-Za-z0-9]/.test(pw),
  };
  const score = Object.values(rules).filter(Boolean).length;
  const labels = ['Muy débil', 'Débil', 'Aceptable', 'Buena', 'Fuerte'];

  const [loading, setLoading] = useStateAuth(false);
  const onSubmit = async (e) => {
    e.preventDefault();
    setError('');
    if (!firstName.trim() || firstName.trim().length < 2) { setError('El nombre debe tener al menos 2 caracteres.'); return; }
    if (/\d/.test(firstName)) { setError('El nombre no puede contener números.'); return; }
    if (!lastName.trim() || lastName.trim().length < 2) { setError('El apellido debe tener al menos 2 caracteres.'); return; }
    if (/\d/.test(lastName)) { setError('El apellido no puede contener números.'); return; }
    if (!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(email.trim())) { setError('Correo electrónico no válido.'); return; }
    if (score < 3) { setError('La contraseña debe ser al menos "Buena" (cumple 3 reglas).'); return; }
    setLoading(true);
    try {
      const r = await SMAuth.register({ firstName, lastName, email: email.trim(), password: pw });
      if (r.ok) window.location.href = 'verify.html';
      else setError(r.error);
    } finally { setLoading(false); }
  };

  return (
    <form className="auth-form" onSubmit={onSubmit}>
      <h1 className="auth-form__title">Crea tu <em>cuenta</em> gratis</h1>
      <p className="auth-form__sub">En menos de un minuto. Sin tarjeta ni compromiso.</p>

      <AuthSeg mode={mode} onChange={onSwitch} />

      <SocialButtons />
      <div className="auth-divider">o con tu correo</div>

      <div className="sm-grid-2" style={{marginBottom: 14}}>
        <div className="auth-field" style={{margin:0}}>
          <label className="auth-field__label">Nombre</label>
          <div className="auth-input-wrap">
            <input className="auth-input" required placeholder="Carlos" value={firstName} onChange={e=>setFirstName(e.target.value)} />
          </div>
        </div>
        <div className="auth-field" style={{margin:0}}>
          <label className="auth-field__label">Apellido</label>
          <div className="auth-input-wrap">
            <input className="auth-input" required placeholder="Pérez" value={lastName} onChange={e=>setLastName(e.target.value)} />
          </div>
        </div>
      </div>

      <div className="auth-field">
        <label className="auth-field__label">Correo electrónico</label>
        <div className="auth-input-wrap">
          <Icon.Mail />
          <input className="auth-input" type="email" required placeholder="tu@correo.com" value={email} onChange={e=>setEmail(e.target.value)} />
        </div>
      </div>

      <div className="auth-field">
        <label className="auth-field__label">Contraseña</label>
        <div className="auth-input-wrap">
          <Icon.Lock />
          <input className="auth-input" type={showPw?'text':'password'} placeholder="Mínimo 8 caracteres" value={pw} onChange={e=>setPw(e.target.value)} />
          <button type="button" className="auth-input-toggle" onClick={()=>setShowPw(!showPw)}>{showPw?'Ocultar':'Mostrar'}</button>
        </div>
        <div className="auth-strength">
          {[0,1,2,3].map(i => <div key={i} className={`auth-strength__bar ${i < score ? 'is-'+score : ''}`} />)}
        </div>
        <div className="auth-strength__label">
          <span>Fortaleza</span>
          <span style={{fontWeight:700, color: score>=3?'oklch(0.4 0.12 145)':'var(--ink-500)'}}>{labels[score]}</span>
        </div>
        <div className="auth-rules">
          <div className={`auth-rule ${rules.length?'auth-rule--ok':''}`}>
            <span className="auth-rule__dot"><Icon.Check width="9" height="9" /></span>8+ caracteres
          </div>
          <div className={`auth-rule ${rules.upper?'auth-rule--ok':''}`}>
            <span className="auth-rule__dot"><Icon.Check width="9" height="9" /></span>Una mayúscula
          </div>
          <div className={`auth-rule ${rules.number?'auth-rule--ok':''}`}>
            <span className="auth-rule__dot"><Icon.Check width="9" height="9" /></span>Un número
          </div>
          <div className={`auth-rule ${rules.symbol?'auth-rule--ok':''}`}>
            <span className="auth-rule__dot"><Icon.Check width="9" height="9" /></span>Un símbolo
          </div>
        </div>
      </div>

      <div className="auth-row" style={{marginTop: 22}}>
        <label className="auth-check">
          <input type="checkbox" defaultChecked />
          <span className="auth-check__box"><Icon.Check width="12" height="12" /></span>
          Acepto los <a href="#" style={{color:'var(--brand-600)', fontWeight:600, marginLeft:4}}>términos</a>
        </label>
      </div>

      {error && <div style={{color:'#c62828', background:'#ffebee', padding:'10px 14px', borderRadius:10, fontSize:13, marginTop:14}}>{error}</div>}

      <button type="submit" className="auth-submit" disabled={loading}>
        {loading ? 'Creando cuenta…' : <>Crear cuenta <Icon.Arrow /></>}
      </button>

      <p className="auth-terms">
        Al continuar aceptas nuestros <a href="#">Términos</a> y <a href="#">Política de privacidad</a>.
      </p>
      <p className="auth-swap">
        ¿Ya tienes cuenta? <a href="#" onClick={e=>{e.preventDefault(); onSwitch('login');}}>Inicia sesión</a>
      </p>
    </form>
  );
}

// ========== UNIFIED AUTH CARD (login + register, in-place crossfade) ==========
function AuthCard({ initialMode }) {
  const [mode, setMode] = useStateAuth(initialMode || 'login');
  const [animKey, setAnimKey] = useStateAuth(0);

  const switchMode = (next) => {
    if (next === mode) return;
    setMode(next);
    setAnimKey(k => k + 1);
    // Update URL silently so it remains shareable / refresh-friendly.
    try {
      const url = next === 'login' ? 'login.html' : 'register.html';
      window.history.replaceState({}, '', url);
      document.title = next === 'login' ? 'SMCUBA · Iniciar sesión' : 'SMCUBA · Crear cuenta';
    } catch (_) {}
  };

  return (
    <div className="auth-shell">
      <AuthSide mode={mode} />
      <div className="auth-form-side">
        <a href="index.html" className="auth-form-side__back">← Volver al inicio</a>
        <div key={animKey} style={{animation:'authSlideFade .42s cubic-bezier(.4,0,.2,1)'}}>
          {mode === 'login'
            ? <LoginForm mode={mode} onSwitch={switchMode} />
            : <RegisterForm mode={mode} onSwitch={switchMode} />}
        </div>
      </div>
      <style>{`
        @keyframes authSlideFade {
          from { opacity: 0; transform: translateY(8px); }
          to   { opacity: 1; transform: translateY(0); }
        }
        @keyframes authFadeIn {
          from { opacity: 0; }
          to   { opacity: 1; }
        }
      `}</style>
    </div>
  );
}

// Backwards-compat wrappers so existing HTML files keep working.
function LoginPage() { return <AuthCard initialMode="login" />; }
function RegisterPage() { return <AuthCard initialMode="register" />; }

// ========== VERIFY OTP ==========
function VerifyPage() {
  const [msg, setMsg] = useStateAuth('');
  const [err, setErr] = useStateAuth('');
  const [sending, setSending] = useStateAuth(false);
  const pendingEmail = SMAuth.pendingEmail() || 'tu correo';

  const resend = async () => {
    setSending(true); setMsg(''); setErr('');
    const r = await SMAuth.resendVerification(SMAuth.pendingEmail());
    setSending(false);
    if (r.ok) setMsg('Te enviamos un nuevo enlace de verificación.');
    else setErr(r.error);
  };

  return (
    <div className="auth-shell">
      <AuthSide mode="register" />
      <div className="auth-form-side">
        <a href="register.html" className="auth-form-side__back">← Volver</a>
        <form className="auth-form" onSubmit={e=>{e.preventDefault(); resend();}}>
          <h1 className="auth-form__title">Verifica tu <em>correo</em></h1>
          <p className="auth-form__sub">Enviamos un enlace de confirmación a <strong style={{color:'var(--ink-900)'}}>{pendingEmail}</strong>. Ábrelo desde tu correo para activar tu cuenta y luego inicia sesión.</p>

          <div style={{background:'var(--brand-50, #eef)', border:'1px solid var(--brand-200, #dde)', borderRadius:12, padding:'14px 16px', margin:'16px 0 22px', fontSize:14, lineHeight:1.5}}>
            1. Abre la bandeja de entrada del correo indicado.<br/>
            2. Haz clic en el botón "Confirm your email".<br/>
            3. Vuelve aquí e inicia sesión.
          </div>

          {msg && <div style={{color:'#2e7d32', background:'#e8f5e9', padding:'10px 14px', borderRadius:10, fontSize:13, margin:'12px 0'}}>{msg}</div>}
          {err && <div style={{color:'#c62828', background:'#ffebee', padding:'10px 14px', borderRadius:10, fontSize:13, margin:'12px 0'}}>{err}</div>}

          <button type="submit" className="auth-submit" disabled={sending}>
            {sending ? 'Reenviando…' : <>Reenviar enlace <Icon.Send /></>}
          </button>

          <p className="auth-swap">
            <a href="login.html">Ir al inicio de sesión</a> · <a href="register.html">Cambiar correo</a>
          </p>
        </form>
      </div>
    </div>
  );
}

// ========== FORGOT ==========
function ForgotPage() {
  const [email, setEmail] = useStateAuth('');
  const [msg, setMsg] = useStateAuth('');
  const [err, setErr] = useStateAuth('');
  const [loading, setLoading] = useStateAuth(false);
  const onSubmit = async (e) => {
    e.preventDefault();
    setMsg(''); setErr(''); setLoading(true);
    const r = await SMAuth.resetPassword(email.trim());
    setLoading(false);
    if (r.ok) setMsg('Si existe una cuenta con ese correo, recibirás un enlace para restablecer la contraseña.');
    else setErr(r.error);
  };
  return (
    <div className="auth-shell">
      <AuthSide mode="login" />
      <div className="auth-form-side">
        <a href="login.html" className="auth-form-side__back">← Volver al login</a>
        <form className="auth-form" onSubmit={onSubmit}>
          <h1 className="auth-form__title">Recupera tu <em>contraseña</em></h1>
          <p className="auth-form__sub">Te enviamos un enlace por correo para crear una nueva contraseña.</p>

          <div className="auth-field">
            <label className="auth-field__label">Correo electrónico</label>
            <div className="auth-input-wrap">
              <Icon.Mail />
              <input className="auth-input" type="email" required placeholder="tu@correo.com" value={email} onChange={e=>setEmail(e.target.value)} />
            </div>
          </div>

          {msg && <div style={{color:'#2e7d32', background:'#e8f5e9', padding:'10px 14px', borderRadius:10, fontSize:13, margin:'10px 0'}}>{msg}</div>}
          {err && <div style={{color:'#c62828', background:'#ffebee', padding:'10px 14px', borderRadius:10, fontSize:13, margin:'10px 0'}}>{err}</div>}

          <button type="submit" className="auth-submit" style={{marginTop:10}} disabled={loading}>
            {loading ? 'Enviando…' : <>Enviar enlace <Icon.Send /></>}
          </button>

          <p className="auth-swap">
            ¿Recordaste? <a href="login.html">Inicia sesión</a>
          </p>
        </form>
      </div>
    </div>
  );
}

Object.assign(window, { LoginPage, RegisterPage, VerifyPage, ForgotPage, AuthCard });
