// ============= APP ROOT =============

const NotFound = () => {
  const { role } = useSession();
  const defaultPath = {
    public: '/', candidate: '/dashboard', coordinator: '/co/dashboard',
    volunteer: '/vol/checkin', admin: '/admin/dashboard',
  }[role] || '/';
  return (
    <SidebarLayout>
      <PageHeader title="Page not found" />
      <div className="page-body">
        <EmptyState
          icon={<IconAlert />}
          title="That page doesn't exist"
          description="The screen you're looking for might have been moved or doesn't exist for your role."
          cta={<a href={'#' + defaultPath} className="btn btn-primary">Go to dashboard</a>}
        />
      </div>
    </SidebarLayout>
  );
};

const Routes = () => {
  const { path } = useRouter();
  let params;

  // Public
  if (path === '/' || path === '') return <HomeScreen />;
  if (path === '/login') return <LoginScreen />;
  if (path === '/register') return <RegisterScreen />;
  if (path === '/drives-public') return <PublicDrivesScreen />;

  // Candidate
  if (path === '/dashboard') return <CandidateDashboard />;
  if (path === '/profile') return <ProfileScreen />;
  if (path === '/profile/documents') return <DocumentsScreen />;
  if (path === '/drives') return <CandidateDrivesScreen />;
  if ((params = match('/drives/:id', path))) return <DriveDetailScreen driveId={params.id} />;
  if ((params = match('/drives/:id/journey', path))) return <MyJourneyScreen driveId={params.id} />;
  if (path === '/journey') return <MyJourneyScreen />;
  if (path === '/settings/password') return <PasswordScreen />;

  // Coordinator
  if (path === '/co/dashboard') return <CoordinatorDashboard />;
  if (path === '/co/drives') return <CoordinatorDrivesScreen />;
  if (path === '/co/drives/new') return <CreateDriveScreen />;
  if ((params = match('/co/drives/:id/edit', path))) return <CreateDriveScreen driveId={params.id} />;
  if ((params = match('/co/drives/:id/setup', path))) return <DriveSetupScreen driveId={params.id} />;
  if ((params = match('/co/drives/:id/candidates', path))) return <DriveCandidatesScreen driveId={params.id} />;
  if ((params = match('/co/drives/:id/analytics', path))) return <DriveAnalyticsScreen driveId={params.id} />;
  if (path === '/co/companies') return <CompaniesScreen />;
  if (path === '/co/candidates') return <CoordinatorCandidatesScreen />;
  if (path === '/co/analytics') return <CoordinatorAnalyticsScreen />;

  // Volunteer
  if (path === '/vol/checkin' || path === '/vol') return <CheckInScreen />;
  if ((params = match('/vol/drives/:id/checkin', path))) return <CheckInScreen driveId={params.id} />;
  if (path === '/vol/interviews') return <InterviewsScreen />;
  if ((params = match('/vol/drives/:id/interviews', path))) return <InterviewsScreen driveId={params.id} />;
  if (path === '/vol/offers') return <OffersScreen />;
  if ((params = match('/vol/drives/:id/offers', path))) return <OffersScreen driveId={params.id} />;

  // Admin
  if (path === '/admin/dashboard') return <AdminDashboard />;
  if (path === '/admin/centres') return <CentresScreen />;
  if (path === '/admin/staff') return <StaffScreen />;
  if (path === '/admin/analytics') return <AdminAnalyticsScreen />;
  if (path === '/admin/config') return <ConfigScreen />;

  return <NotFound />;
};

const App = () => (
  <RouterProvider>
    <SessionProvider>
      <ToastProvider>
        <Routes />
      </ToastProvider>
    </SessionProvider>
  </RouterProvider>
);

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