// Root router

const ROUTES = ['landing', 'dashboard', 'upload', 'verify', 'settings']; // simple ones
// project detail: 'project:<id>'
// certificate:   'certificate:<id>'

// `jb.route` is a "resume where you left off" memory for a bare visit to '/'.
// The certificate is the one route that isn't a place you were working — it's
// a public page strangers arrive at from a shared /c/<id> link, and letting it
// stick would make someone else's certificate the app's home screen.
const isResumableRoute = (r) => !!r && !r.startsWith('certificate:');

function App() {
  const [route, setRoute] = React.useState(() => {
    const hash = window.location.hash.slice(1);
    if (hash) return hash;
    try {
      const stored = localStorage.getItem('jb.route');
      // Also filters out a certificate route stored by an older build.
      return isResumableRoute(stored) ? stored : 'landing';
    } catch (e) { return 'landing'; }
  });

  React.useEffect(() => {
    if (isResumableRoute(route)) {
      try { localStorage.setItem('jb.route', route); } catch (e) {}
    }
    window.location.hash = route;
    window.scrollTo(0, 0);
  }, [route]);

  React.useEffect(() => {
    const onHash = () => {
      const h = window.location.hash.slice(1);
      if (h && h !== route) setRoute(h);
    };
    window.addEventListener('hashchange', onHash);
    return () => window.removeEventListener('hashchange', onHash);
  }, [route]);

  const navigate = (r) => setRoute(r);

  // Safety net: without this, dropping a file anywhere outside an explicit
  // dropzone makes the browser navigate away to display the raw file,
  // destroying the whole SPA. Dropzones stop propagation before this runs.
  React.useEffect(() => {
    const preventDefault = (e) => e.preventDefault();
    window.addEventListener('dragover', preventDefault);
    window.addEventListener('drop', preventDefault);
    return () => {
      window.removeEventListener('dragover', preventDefault);
      window.removeEventListener('drop', preventDefault);
    };
  }, []);

  // Parse compound routes
  let page = null;
  const [base, arg] = route.split(':');
  const showNav = base !== 'certificate';

  if (base === 'landing') page = <Landing onNavigate={navigate} />;
  else if (base === 'dashboard') page = <Dashboard onNavigate={navigate} />;
  else if (base === 'upload') page = <Upload onNavigate={navigate} />;
  else if (base === 'verify') page = <Verify onNavigate={navigate} />;
  else if (base === 'settings') page = <Settings onNavigate={navigate} />;
  else if (base === 'project') page = <ProjectDetail projectId={arg} onNavigate={navigate} />;
  else if (base === 'certificate') page = <Certificate projectId={arg} onNavigate={navigate} />;
  else if (base === 'explorer') page = <Explorer onNavigate={navigate} />;
  else if (base === 'block') page = <BlockDetail blockNumber={arg} onNavigate={navigate} />;
  else if (base === 'tx') page = <TxDetail txHash={arg} onNavigate={navigate} />;
  else if (base === 'admin') page = <Admin onNavigate={navigate} />;
  else if (base === 'adminproject') page = <AdminProjectDetail projectId={arg} onNavigate={navigate} />;
  else page = <Landing onNavigate={navigate} />;

  return (
    <div className="app-shell" data-screen-label={base}>
      {showNav && <Nav route={base} onNavigate={navigate} />}
      {/* Certificate is excluded on purpose — it carries the same disclosure
          inside the document body instead, so it survives print/PDF and
          travels with the page when someone forwards the link. */}
      {showNav && <ChainNoticeBar />}
      {page}
    </div>
  );
}

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