import React, { FC } from 'react';
import { ThemeProvider } from '@material-ui/core/styles';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import { AuthRoutes, NonAuthRoutes } from 'api/routes';
import { Roles } from 'api/userRoles';
import { configDjangoCookieName } from 'api/axios/configDjangoCookieName';
import { appTheme } from 'App.style';
import { withAuthorization } from 'components/Authorization/Authorization';
import { AuthUser } from 'components/Auth/Auth';
import { Dashboard } from 'components/Dashboard/Dashboard';
import { NotFound } from 'components/NotFound/NotFound';
import { Unauthorized } from 'components/Unauthorized/Unauthorized';
import { LandingPage } from 'components/LandingPage/LandingPage';
import { configureInterceptors } from 'api/axios/configureInterceptors';

const All = withAuthorization([
  Roles.admin,
  Roles.operator,
  Roles.senior,
  Roles.driver,
]);

/**
 * Entry point of the app.
 */
export const App: FC = () => {
  configureInterceptors();
  configDjangoCookieName();

  return (
    <div data-testid="App">
      <ThemeProvider theme={appTheme}>
        <Router>
          <Switch>
            <Route exact path={NonAuthRoutes.home} component={LandingPage} />
            <Route path={NonAuthRoutes.auth} component={AuthUser} />
            <Route path={AuthRoutes.dashboard} component={All(Dashboard)} />
            <Route path={NonAuthRoutes.unauthorized} component={Unauthorized} />
            <Route component={NotFound} />
          </Switch>
        </Router>
      </ThemeProvider>
    </div>
  );
};