/* global React, ReactDOM, AUTH_PRESETS, TopNav, SideNav, HomePage, GamesPage, ReferralPage, ProfilePage, CodesPage, GameTokensPage, RewardsPage, NewsPage, RoadmapPage, WebnovelPage, SupportPage, AboutPage, ContactPage, PrivacyPage, ShopPage, LoginPage, GAMES, Icon, t, HUB_LANG */

const VALID_PAGES = new Set([
  'home', 'games', 'referral', 'profile', 'rewards', 'login',
  'news', 'roadmap', 'shop', 'tokens', 'codes',
  'webnovel', 'support', 'about', 'contact', 'privacy',
]);

const HASH_ROUTE_RE = /^#\/?([a-z-]+)(?:\/(.+))?$/;

function parseHashRoute(hash) {
  const match = (hash || '').trim().match(HASH_ROUTE_RE);
  if (!match) return null;
  const routePage = match[1];
  if (!VALID_PAGES.has(routePage)) return null;
  const routeSub = match[2] || '';
  return { page: routePage, sub: routeSub };
}

// Parse the URL hash (e.g. #profile/settings) and initial ?authState param for the demo
function readInitialRoute() {
  try {
    const route = parseHashRoute(window.location.hash || '');
    if (route) return route;
  } catch (e) {}
  const saved = localStorage.getItem('shaste-hub-page');
  if (saved && VALID_PAGES.has(saved)) return { page: saved, sub: '' };
  return { page: 'home', sub: '' };
}

function readInitialAuth() {
  try {
    const qp = new URLSearchParams(window.location.search);
    const fromUrl = qp.get('authState');
    if (fromUrl && AUTH_PRESETS[fromUrl]) return fromUrl;
  } catch (e) {}
  const saved = localStorage.getItem('shaste-hub-auth');
  if (saved && AUTH_PRESETS[saved]) return saved;
  // Default to guest so logged-out visitors never see logged-in UI
  return 'guest';
}

function useIsMobile(breakpoint = 720) {
  const [isMobile, setIsMobile] = React.useState(() => {
    if (typeof window === 'undefined') return false;
    return window.matchMedia(`(max-width: ${breakpoint}px)`).matches;
  });
  React.useEffect(() => {
    const mq = window.matchMedia(`(max-width: ${breakpoint}px)`);
    const onChange = (e) => setIsMobile(e.matches);
    if (mq.addEventListener) mq.addEventListener('change', onChange);
    else mq.addListener(onChange);
    return () => {
      if (mq.removeEventListener) mq.removeEventListener('change', onChange);
      else mq.removeListener(onChange);
    };
  }, [breakpoint]);
  return isMobile;
}

function App() {
  const [authState] = React.useState(readInitialAuth);
  const [{ page, sub }, setRoute] = React.useState(readInitialRoute);
  const setPage = React.useCallback((nextPage) => {
    setRoute((prev) => ({ page: nextPage, sub: prev.page === nextPage ? prev.sub : '' }));
  }, []);
  const [newsItems, setNewsItems] = React.useState([]);
  const isMobile = useIsMobile(720);

  React.useEffect(() => {
    let cancelled = false;
    (async () => {
      try {
        const res = await fetch('/api/news');
        if (!res.ok) return;
        const payload = await res.json();
        const list = Array.isArray(payload) ? payload : (Array.isArray(payload.items) ? payload.items : []);
        if (!cancelled) setNewsItems(list);
      } catch (e) {}
    })();
    return () => { cancelled = true; };
  }, []);

  // Persist page + push hash
  React.useEffect(() => {
    localStorage.setItem('shaste-hub-page', page);
    const nextHash = `#${page}${sub ? `/${sub}` : ''}`;
    const currentHash = window.location.hash || '';
    if (currentHash !== nextHash) {
      try { history.replaceState(null, '', nextHash); } catch (e) {}
    }
    window.scrollTo({ top: 0, behavior: 'instant' });
  }, [page, sub]);

  // Sync on back/forward.
  React.useEffect(() => {
    const onHash = () => {
      const route = parseHashRoute(window.location.hash || '');
      if (route) setRoute(route);
    };
    window.addEventListener('hashchange', onHash);
    return () => window.removeEventListener('hashchange', onHash);
  }, []);

  React.useEffect(() => {
    document.body.setAttribute('data-aesthetic', 'evolved');
    document.body.setAttribute('data-show-glow', 'true');
  }, []);

  // Build the effective auth object:
  //   1. Start from the preset in AUTH_PRESETS (drives labels, upsell copy).
  //   2. If auth-sync wrote SHASTE_AUTH_OVERRIDE from a real JWT AND the user
  //      merge the override so XP / coins / referrals / achievements come from
  //      the real user.
  const preset = AUTH_PRESETS[authState] || AUTH_PRESETS.follower;
  const override = (typeof window !== 'undefined' && window.SHASTE_AUTH_OVERRIDE) || null;
  const overrideApplies = !!(override && override._authState === authState);
  const auth = overrideApplies
    ? Object.assign({}, preset, Object.fromEntries(
        Object.entries(override).filter(([k, v]) => v !== undefined && !k.startsWith('_'))
      ))
    : preset;

  // Auto-pick nav style: Top HUD on desktop, Sidebar on mobile
  const effectiveNavStyle = isMobile ? 'sidebar' : 'hud';

  const renderPage = () => {
    switch (page) {
      case 'home': return <HomePage auth={auth} setPage={setPage} sub={sub} newsItems={newsItems} />;
      case 'games': return <GamesPage auth={auth} setPage={setPage} sub={sub} />;
      case 'referral': return <ReferralPage auth={auth} setPage={setPage} sub={sub} />;
      case 'profile': return <ProfilePage auth={auth} setPage={setPage} sub={sub} />;
      case 'tokens': return <GameTokensPage auth={auth} setPage={setPage} sub={sub} />;
      case 'codes': return <CodesPage setPage={setPage} sub={sub} />;
      case 'rewards': return <RewardsPage auth={auth} setPage={setPage} sub={sub} />;
      case 'shop': return <ShopPage auth={auth} setPage={setPage} sub={sub} />;
      case 'login': return <LoginPage setPage={setPage} sub={sub} />;
      case 'news': return <NewsPage setPage={setPage} sub={sub} />;
      case 'roadmap': return <RoadmapPage setPage={setPage} sub={sub} />;
      case 'webnovel': return <WebnovelPage setPage={setPage} sub={sub} />;
      case 'support': return <SupportPage setPage={setPage} sub={sub} />;
      case 'about': return <AboutPage setPage={setPage} sub={sub} />;
      case 'contact': return <ContactPage setPage={setPage} sub={sub} />;
      case 'privacy': return <PrivacyPage setPage={setPage} sub={sub} />;
      default: return <HomePage auth={auth} setPage={setPage} sub={sub} newsItems={newsItems} />;
    }
  };

  const useSidebar = effectiveNavStyle === 'sidebar';

  return (
    <div className="app-shell">
      {useSidebar
        ? <SideNav page={page} setPage={setPage} auth={auth} />
        : <TopNav page={page} setPage={setPage} auth={auth} navStyle={effectiveNavStyle} />}

      <main className={`page ${useSidebar ? 'page--sidebar' : ''}`}>
        {renderPage()}
        <footer className="foot">
          <div className="container foot__row">
            <div>© 2026 ShasteGames</div>
            <div>
              <a href="#privacy">{t('footer.privacy')}</a>
              <a href="#contact">{t('footer.contact')}</a>
              <a href="https://www.patreon.com/c/Shaste" target="_blank" rel="noopener">{t('nav.patreon')}</a>
              <a href="https://shastes.itch.io/" target="_blank" rel="noopener">Itch.io</a>
            </div>
            <div style={{ display: 'flex', gap: 10, color: 'var(--subtle)', flexWrap: 'wrap' }}>
              <a href="/en/">English</a>
              <a href="/fr/">Français</a>
              <a href="/de/">Deutsch</a>
              <a href="/es/">Español</a>
              <a href="/it/">Italiano</a>
              <a href="/pt/">Português</a>
              <a href="/ru/">Русский</a>
              <a href="/zh/">中文</a>
              <a href="/ja/">日本語</a>
              <a href="/ko/">한국어</a>
            </div>
          </div>
        </footer>
      </main>
    </div>
  );
}

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