// MCP Hero — app shell with real API integration and session management
const { useState: useAppState, useEffect: useAppEffect } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "role": "guest",
  "homeStyle": "Editorial",
  "credits": "Normal",
  "dark": false,
  "accent": "#5B5BD6",
  "typeset": "Sora + Source Sans"
}/*EDITMODE-END*/;

const MH_TYPESETS = {
  'Bricolage + Instrument': { display: "'Bricolage Grotesque', sans-serif", body: "'Instrument Sans', sans-serif" },
  'Space Grotesk + Plex': { display: "'Space Grotesk', sans-serif", body: "'IBM Plex Sans', sans-serif" },
  'Sora + Source Sans': { display: "'Sora', sans-serif", body: "'Source Sans 3', sans-serif" },
};

// ---------- Auth Hook with Real API ----------
function useAuth() {
  const [user, setUser] = useAppState(null);
  const [loading, setLoading] = useAppState(true);

  useAppEffect(() => {
    // Check for existing session on mount
    const session = window.apiService?.getSession();
    if (session && session.token && session.user) {
      setUser(session.user);
    }
    setLoading(false);

    // Listen for auth changes
    const handleAuthChange = (event) => {
      setUser(event.detail.user);
    };

    window.addEventListener('auth-change', handleAuthChange);
    return () => window.removeEventListener('auth-change', handleAuthChange);
  }, []);

  const logout = async (nav) => {
    try {
      await window.apiService?.logout();
      setUser(null);
      window.dispatchEvent(new CustomEvent('auth-change', {
        detail: { user: null, token: null }
      }));
      nav('/login');
    } catch (error) {
      console.error('Logout error:', error);
      // Force logout even if API fails
      window.apiService?.clearSession();
      setUser(null);
      nav('/login');
    }
  };

  return { user, loading, logout };
}

// ---------- tiny hash router ----------
function useRoute() {
  const get = () => {
    const h = window.location.hash.replace(/^#/, '');
    return h || '/';
  };
  const [route, setRoute] = useAppState(get);
  useAppEffect(() => {
    const fn = () => setRoute(get());
    window.addEventListener('hashchange', fn);
    return () => window.removeEventListener('hashchange', fn);
  }, []);
  const nav = (path) => {
    window.location.hash = path;
    window.scrollTo({ top: 0 });
  };
  return [route, nav];
}

// ---------- public header with real user data ----------
function PublicHeader({ route, nav, user, dark, setTweak, onLogout }) {
  const loggedIn = !!user;
  const NavLink = ({ path, children, match }) => {
    const active = match ? route.startsWith(match) : route === path;
    return (
      <button onClick={() => nav(path)} style={{
        border: 'none', background: 'transparent', cursor: 'pointer', padding: '6px 11px',
        fontSize: 14, fontWeight: 600, borderRadius: 8,
        color: active ? 'var(--text)' : 'var(--text-3)', transition: 'color .13s ease',
      }}>{children}</button>
    );
  };

  // Get user initials for avatar
  const getInitials = (name) => {
    if (!name) return 'U';
    return name
      .split(' ')
      .map(n => n[0])
      .join('')
      .toUpperCase()
      .slice(0, 2);
  };

  return (
    <header style={{
      position: 'sticky', top: 0, zIndex: 100, backdropFilter: 'blur(12px)',
      background: 'color-mix(in oklch, var(--bg) 82%, transparent)',
      borderBottom: '1px solid var(--border)',
    }}>
      <div style={{ maxWidth: 1240, margin: '0 auto', padding: '12px 28px', display: 'flex', alignItems: 'center', gap: 18 }}>
        <button onClick={() => nav('/')} style={{ border: 'none', background: 'transparent', cursor: 'pointer', padding: 0 }}>
          <Logo size={29}></Logo>
        </button>
        <nav style={{ display: 'flex', gap: 2 }}>
          <NavLink path="/">Marketplace</NavLink>
          <NavLink path="/pricing">Pricing</NavLink>
          {loggedIn ? <NavLink path="/dashboard" match="/dashboard">Dashboard</NavLink> : null}
        </nav>
        <div style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 11 }}>
          <button onClick={() => setTweak('dark', !dark)} title="Toggle theme" style={{
            border: '1px solid var(--border)', background: 'var(--bg-raised)', cursor: 'pointer',
            width: 34, height: 34, borderRadius: 9, display: 'flex', alignItems: 'center', justifyContent: 'center',
            color: 'var(--text-2)',
          }}>
            <Icon name={dark ? 'sun' : 'moon'} size={16}></Icon>
          </button>
          {loggedIn && user ? (
            <React.Fragment>
              <button
                onClick={() => nav(user.accountType === 'organization' ? '/dashboard/credits' : '/dashboard')}
                title="Account balance"
                style={{
                  display: 'flex', alignItems: 'center', gap: 7, padding: '7px 13px', borderRadius: 999,
                  border: '1px solid var(--border)', background: 'var(--bg-raised)', cursor: 'pointer',
                  fontSize: 13.5, fontWeight: 700, color: 'var(--text)',
                }}
              >
                <Icon name="coin" size={15} style={{ color: 'var(--warn)' }}></Icon>
                {user.orgId ? 'Organization' : 'Personal'}
              </button>
              <button onClick={() => nav('/dashboard/profile')} title="Account settings" style={{ border: 'none', background: 'transparent', cursor: 'pointer', padding: 0 }}>
                <Avatar initials={getInitials(user.fullName)} size={34} hue={(user.fullName?.length || 1) * 47 % 360}></Avatar>
              </button>
              <button onClick={() => onLogout(nav)} title="Sign out" style={{
                border: '1px solid var(--border)', background: 'var(--bg-raised)', cursor: 'pointer',
                width: 34, height: 34, borderRadius: 9, display: 'flex', alignItems: 'center', justifyContent: 'center',
                color: 'var(--text-2)',
              }}>
                <Icon name="logOut" size={16}></Icon>
              </button>
            </React.Fragment>
          ) : (
            <React.Fragment>
              <Btn variant="ghost" onClick={() => nav('/login')}>Sign in</Btn>
              <Btn onClick={() => nav('/register')}>Get started</Btn>
            </React.Fragment>
          )}
        </div>
      </div>
    </header>
  );
}

function PublicFooter({ nav }) {
  return (
    <footer style={{ borderTop: '1px solid var(--border)', marginTop: 'auto' }}>
      <div style={{ maxWidth: 1240, margin: '0 auto', padding: '22px 28px', display: 'flex', alignItems: 'center', gap: 18, flexWrap: 'wrap' }}>
        <Logo size={22}></Logo>
        <span style={{ fontSize: 12.5, color: 'var(--text-3)' }}>An Agmo platform · Kuala Lumpur</span>
        <div style={{ marginLeft: 'auto', display: 'flex', gap: 16, fontSize: 12.5 }}>
          <a href="#/pricing" style={{ color: 'var(--text-3)', textDecoration: 'none', fontWeight: 600 }}>Pricing</a>
          <a href="https://mcp-hero-api-gateway-dev.honglok.workers.dev/docs" target="_blank" style={{ color: 'var(--text-3)', textDecoration: 'none', fontWeight: 600 }}>API Docs ↗</a>
        </div>
      </div>
    </footer>
  );
}

// ---------- App with Real API Integration ----------
function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [route, nav] = useRoute();
  const { user, loading: authLoading, logout } = useAuth();

  // strip entrance-animation classes once they've played
  useAppEffect(() => {
    const id = setTimeout(() => {
      document.querySelectorAll('.mh-anim').forEach((el) => el.classList.remove('mh-anim'));
    }, 600);
    return () => clearTimeout(id);
  }, [route, t.homeStyle, user]);

  // apply theme + tokens
  useAppEffect(() => {
    const r = document.documentElement;
    r.setAttribute('data-theme', t.dark ? 'dark' : 'light');
    r.style.setProperty('--accent', t.accent);
    r.style.setProperty('--accent-strong', `color-mix(in oklch, ${t.accent} 84%, black)`);
    const ts = MH_TYPESETS[t.typeset] || MH_TYPESETS['Bricolage + Instrument'];
    r.style.setProperty('--font-display', ts.display);
    r.style.setProperty('--font-body', ts.body);
  }, [t.dark, t.accent, t.typeset]);

  // Show loading state while checking auth
  if (authLoading) {
    return (
      <div style={{
        minHeight: '100vh', display: 'flex', alignItems: 'center', justifyContent: 'center',
        flexDirection: 'column', gap: 16
      }}>
        <div style={{
          width: 40, height: 40, borderRadius: '50%',
          border: '3px solid var(--border)', borderTopColor: 'var(--accent)',
          animation: 'spin 1s linear infinite'
        }}></div>
        <span style={{ color: 'var(--text-2)', fontSize: 14 }}>Loading...</span>
      </div>
    );
  }

  const isAuth = route === '/login' || route === '/register' || route === '/forgot' || route.startsWith('/invitation');
  const isAdmin = route.startsWith('/admin');
  const isDash = route.startsWith('/dashboard');

  // Protected route check
  if ((isDash || isAdmin) && !user) {
    // Redirect to login if trying to access protected routes
    useAppEffect(() => {
      nav('/login');
    }, []);
    return null;
  }

  let page = null;
  if (isAdmin) {
    page = <AdminShell route={route} nav={nav} user={user} />;
  } else if (route === '/login') {
    page = <div data-screen-label="Login"><LoginScreen nav={nav}></LoginScreen></div>;
  } else if (route === '/register') {
    page = <div data-screen-label="Register"><RegisterScreen nav={nav}></RegisterScreen></div>;
  } else if (route === '/forgot') {
    page = <div data-screen-label="Forgot password"><ForgotScreen nav={nav}></ForgotScreen></div>;
  } else if (route.startsWith('/invitation')) {
    page = <div data-screen-label="Accept invitation"><InvitationScreen nav={nav}></InvitationScreen></div>;
  } else {
    const mcpMatch = route.match(/^\/mcps\/([\w-]+)$/);
    let inner = null;
    if (isDash) {
      inner = <DashboardShell route={route} user={user} nav={nav} />;
    } else if (mcpMatch) {
      inner = <div data-screen-label={'MCP detail — ' + mcpMatch[1]}><McpDetail slug={mcpMatch[1]} nav={nav} loggedIn={!!user} /></div>;
    } else if (route === '/pricing') {
      inner = <div data-screen-label="Pricing"><PricingPage nav={nav} loggedIn={!!user} /></div>;
    } else {
      inner = <div data-screen-label="Marketplace home"><MarketplaceHome nav={nav} homeStyle={t.homeStyle} /></div>;
    }
    page = (
      <div style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
        <PublicHeader route={route} nav={nav} user={user} dark={t.dark} setTweak={setTweak} onLogout={logout} />
        <div style={{ flex: 1 }}>{inner}</div>
        <PublicFooter nav={nav} />
      </div>
    );
  }

  return (
    <ToastProvider>
      {page}
    </ToastProvider>
  );
}

// Add spin animation
if (typeof document !== 'undefined') {
  const style = document.createElement('style');
  style.textContent = `
    @keyframes spin {
      to { transform: rotate(360deg); }
    }
  `;
  document.head.appendChild(style);
}

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