// app.jsx — main app shell with login + routing + tweaks

const { useState: useStateApp, useEffect: useEffectApp } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "light",
  "density": "comfortable",
  "sidebar": "expanded"
}/*EDITMODE-END*/;

// Resolve which page ids a signed-in user may access, from the loaded
// permission matrix. If the sheet has no page columns yet (col C onward empty),
// fall back to "all visible" so the app stays usable during setup.
function resolveAllowed(perms, user) {
  if (!perms || !user) return null;
  if (perms.pageCols.length === 0) {
    const all = {};
    (window.NAV_PAGE_IDS || []).forEach((id) => { all[id] = true; });
    return all;
  }
  const entry = perms.byRole[user.role];
  return entry ? entry.pages : {};
}

function App() {
  const [user, setUser]   = useStateApp(null);
  const [route, setRoute] = useStateApp('home');
  const [perms, setPerms] = useStateApp(null);     // { pageCols, byRole } or null while loading
  const [permsErr, setPermsErr] = useStateApp('');
  const [t, setTweak]     = window.useTweaks(TWEAK_DEFAULTS);

  // Apply theme + density to <html>
  useEffectApp(() => {
    document.documentElement.setAttribute('data-theme', t.theme);
    document.documentElement.setAttribute('data-density', t.density);
  }, [t.theme, t.density]);

  // Reset route to home when user changes
  useEffectApp(() => { if (user) setRoute('home'); }, [user]);

  // Load the permission matrix from the sheet once a user signs in.
  useEffectApp(() => {
    if (!user) { setPerms(null); setPermsErr(''); return; }
    let cancelled = false;
    setPerms(null); setPermsErr('');
    window.RTDC_SHEETS.loadPermissions()
      .then((p) => { if (!cancelled) setPerms(p); })
      .catch(() => { if (!cancelled) setPermsErr('Could not load access permissions from the sheet.'); });
    return () => { cancelled = true; };
  }, [user]);

  // Route guard: if the current page isn't permitted, jump to the first allowed page.
  useEffectApp(() => {
    if (!user || !perms) return;
    const allowed = resolveAllowed(perms, user);
    if (allowed && !allowed[route]) {
      const first = (window.NAV_PAGE_IDS || []).find((id) => allowed[id]);
      if (first && first !== route) setRoute(first);
    }
  }, [perms, route, user]);

  const handleLogout = () => {
    setUser(null);
    setRoute('home');
    setPerms(null);
    setPermsErr('');
  };

  if (!user) {
    return (
      <>
        <window.LoginPage onLogin={setUser} />
        <Tweaks t={t} setTweak={setTweak} />
      </>
    );
  }

  const roleEntry  = perms ? perms.byRole[user.role] : null;
  const allowed    = resolveAllowed(perms, user);
  const permsReady = !!perms;
  const roleDisplay = (roleEntry && roleEntry.displayName) || user.role;
  const hasAnyAccess = !!(allowed && Object.keys(allowed).some((k) => allowed[k]));
  const Page = ROUTES[route] || ROUTES.home;

  return (
    <div className="app-shell" data-sidebar={t.sidebar === 'icon-only' ? 'collapsed' : 'expanded'}>
      <window.Topbar
        user={{ ...user, title: roleDisplay }}
        onLogout={handleLogout}
        onToggleSidebar={() => setTweak('sidebar', t.sidebar === 'icon-only' ? 'expanded' : 'icon-only')}
      />
      <window.Sidebar
        active={route}
        onNavigate={setRoute}
        allowed={allowed}
        permsReady={permsReady}
        collapsed={t.sidebar === 'icon-only'}
      />
      <main className="main">
        {!permsReady && !permsErr && <CenterPane>Loading your workspace…</CenterPane>}
        {permsErr && <CenterPane tone="error">{permsErr}</CenterPane>}
        {permsReady && !permsErr && !hasAnyAccess && (
          <CenterPane tone="error">
            Your role <strong>“{user.role}”</strong> has no page access configured.
            Please contact your administrator.
          </CenterPane>
        )}
        {permsReady && hasAnyAccess && allowed[route] && (
          <Page user={user} onNavigate={setRoute} />
        )}
      </main>
      <Tweaks t={t} setTweak={setTweak} />
    </div>
  );
}

// Simple centered message pane for loading / empty / error states.
function CenterPane({ children, tone }) {
  return (
    <div style={{
      minHeight: '50vh', display: 'flex', alignItems: 'center', justifyContent: 'center',
      textAlign: 'center', padding: 24,
      color: tone === 'error' ? 'var(--rtdc-red)' : 'var(--text-muted)',
      fontSize: 14, maxWidth: 520, margin: '0 auto', lineHeight: 1.6,
    }}>
      <div>{children}</div>
    </div>
  );
}

const ROUTES = {
  'home':       (p) => <window.HomePage {...p} />,
  'talent-box': (p) => <window.TalentBoxPage {...p} />,
  'ccd':        (p) => <window.CCDPage {...p} />,
  'kpi':        (p) => <window.KPIPage {...p} />,
  'core':       (p) => <window.CoreValuesPage {...p} />,
  'comp':       (p) => <window.CompetencyPage {...p} />,
  'report':     (p) => <window.TalentReportPage {...p} />,
};

// ─── Tweaks Panel ───
function Tweaks({ t, setTweak }) {
  const { TweaksPanel, TweakSection, TweakRadio, TweakSelect } = window;
  return (
    <TweaksPanel>
      <TweakSection label="Appearance" />
      <TweakRadio
        label="Theme"
        value={t.theme}
        options={['light', 'dark']}
        onChange={(v) => setTweak('theme', v)}
      />
      <TweakRadio
        label="Density"
        value={t.density}
        options={['compact', 'comfortable']}
        onChange={(v) => setTweak('density', v)}
      />
      <TweakSection label="Sidebar" />
      <TweakRadio
        label="Style"
        value={t.sidebar}
        options={['expanded', 'icon-only']}
        onChange={(v) => setTweak('sidebar', v)}
      />
    </TweaksPanel>
  );
}

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