// auth-store.jsx — 진짜 계정 시스템 (백엔드 없어도 작동)
// localStorage 에 등록된 사용자 DB 를 두고, 가입·이메일 인증·로그인을 실제로 강제한다.
// 백엔드(API_BASE)가 있으면 그쪽을 우선 사용하고, 없으면 이 로컬 DB 로 동작한다.
// → "회원가입 안 해도 단계가 넘어가는" 문제를 근본적으로 차단.

(function () {
  const DB_KEY = 'urijib_users_db';   // { [email]: {id,email,name,pwHash,provider,verified,verifyCode,onboarded,joinedAt,preferences} }
  const SESSION_KEY = 'urijib_user';  // 현재 로그인 사용자 (tracker 와 공유)

  function readDB() {
    try { return JSON.parse(localStorage.getItem(DB_KEY) || '{}'); } catch (e) { return {}; }
  }
  function writeDB(db) { localStorage.setItem(DB_KEY, JSON.stringify(db)); }

  async function hash(s) {
    const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode('urijib_salt::' + s));
    return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join('');
  }
  function normEmail(e) { return (e || '').trim().toLowerCase(); }
  function genCode() { return ('' + Math.floor(100000 + Math.random() * 900000)); }
  function genId() { return 'u_' + Math.random().toString(36).slice(2, 10) + Date.now().toString(36).slice(-4); }

  // ─── 가입: pending 계정 생성 + 인증코드 발급 ─────────────
  async function register({ email, password, name, marketing }) {
    email = normEmail(email);
    if (!email || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) return { error: 'invalid_email' };
    if (!password || password.length < 8) return { error: 'weak_password' };
    const db = readDB();
    if (db[email] && db[email].verified) return { error: 'email_taken' };
    const code = genCode();
    const user = {
      id: db[email]?.id || genId(),
      email,
      name: name || email.split('@')[0],
      pwHash: await hash(password),
      provider: 'email',
      verified: false,
      verifyCode: code,
      codeExpires: Date.now() + 10 * 60 * 1000,
      onboarded: false,
      marketing: !!marketing,
      joinedAt: Date.now(),
    };
    db[email] = user;
    writeDB(db);
    // 실제 서비스라면 이메일 발송. 데모에서는 코드를 즉시 반환(화면에 표시).
    return { ok: true, email, demoCode: code };
  }

  // ─── 이메일 인증 ─────────────────────────────────────────
  function verifyEmail(email, code) {
    email = normEmail(email);
    const db = readDB();
    const u = db[email];
    if (!u) return { error: 'no_account' };
    if (u.verified) return { ok: true, already: true };
    if (Date.now() > (u.codeExpires || 0)) return { error: 'code_expired' };
    if (('' + code).trim() !== u.verifyCode) return { error: 'code_mismatch' };
    u.verified = true;
    u.verifyCode = null;
    writeDB(db);
    return { ok: true };
  }

  function resendCode(email) {
    email = normEmail(email);
    const db = readDB();
    const u = db[email];
    if (!u) return { error: 'no_account' };
    u.verifyCode = genCode();
    u.codeExpires = Date.now() + 10 * 60 * 1000;
    writeDB(db);
    return { ok: true, demoCode: u.verifyCode };
  }

  // ─── 로그인: 등록 + 인증된 계정만 통과 ──────────────────
  async function authenticate(email, password) {
    email = normEmail(email);
    const db = readDB();
    const u = db[email];
    if (!u) return { error: 'no_account' };
    if (u.pwHash !== await hash(password)) return { error: 'wrong_password' };
    if (!u.verified) return { error: 'not_verified', email };
    return { ok: true, user: publicUser(u) };
  }

  // ─── SSO 계정 (백엔드 없을 때 데모) — 가입 즉시 verified ──
  function registerSSO(provider) {
    const email = normEmail('demo_' + provider + '_' + Math.random().toString(36).slice(2, 6) + '@' + provider + '.user');
    const db = readDB();
    const names = { kakao: '카카오 사용자', naver: '네이버 사용자', google: 'Google User', apple: 'Apple User' };
    const u = {
      id: genId(), email, name: names[provider] || '사용자',
      pwHash: null, provider, verified: true, onboarded: false, joinedAt: Date.now(),
    };
    db[email] = u;
    writeDB(db);
    return publicUser(u);
  }

  function publicUser(u) {
    return { id: u.id, email: u.email, name: u.name, provider: u.provider, verified: u.verified, onboarded: u.onboarded, joinedAt: u.joinedAt, preferences: u.preferences };
  }

  function setOnboarded(email, preferences) {
    email = normEmail(email);
    const db = readDB();
    if (db[email]) { db[email].onboarded = true; db[email].preferences = preferences; writeDB(db); }
  }

  function getAccount(email) {
    const db = readDB();
    return db[normEmail(email)] ? publicUser(db[normEmail(email)]) : null;
  }

  window.UJAuth = {
    register, verifyEmail, resendCode, authenticate, registerSSO, setOnboarded, getAccount, publicUser,
  };
})();
