// Delete these imports when migration is done
import { type FC, useEffect } from 'react';
import { type RouteObject, useNavigate, useRoutes } from 'react-router-dom';

import { MsalProvider } from '@azure/msal-react';
import { OktaAuth, toRelativeUrl } from '@okta/okta-auth-js';
import { Security as OktaProvider } from '@okta/okta-react';
import { GoogleOAuthProvider } from '@react-oauth/google';

import 'src/config/i18n';

import { NuqsAdapter } from 'nuqs/adapters/react-router';
import { AdapterDateFns } from '@material-hu/mui/x-date-pickers/AdapterDateFns';
import { LocalizationProvider } from '@material-hu/mui/x-date-pickers/LocalizationProvider';

import Image from '@material-hu/components/composed-components/Image';

import HuLogo from 'src/assets/hu.svg';
import { pca } from 'src/config/azure';
import { OKTA_CONFIG } from 'src/config/okta';
import { setupYup } from 'src/config/yup';
import useAuth from 'src/contexts/JWTContext';
import useTimeInApp from 'src/hooks/useTimeInApp';
import useTimeInModules from 'src/hooks/useTimeInModules';
import useTokenManagerHandlers from 'src/hooks/useTokenManagerHandlers';
import { useIconsRefetch } from 'src/utils/icons';

import ErrorBoundary from 'src/components/ErrorBoundary';
import InactivityTimer from 'src/components/InactivityTimer';
import TopModal from 'src/components/TopModal';

import GlobalStyles from '@material-hu/components/composed-components/GlobalStyles';
import LoadingScreen from './components/LoadingScreen';
import MaintenanceGuard from './components/MaintenanceGuard';
import useCommunityFeature from './hooks/useCommunityFeature';
import useScrollReset from './hooks/useScrollReset';
import routes from './routes';
import { CommunityFeature } from './types/communityFeatures';
import { type User } from './types/user';
import { useLokaliseTranslation } from './utils/i18n';
import { getCurrentLocale } from './utils/locale';

const LOGO_DIMENSIONS = 52;

const GLOBAL_STYLES_OVERRIDES = {
  'input:-webkit-autofill': {
    WebkitBoxShadow: 'none',
    WebkitTextFillColor: 'inherit',
    transition: 'background-color 5000s ease-in-out 0s',
  },
} as const;

const oktaAuth = new OktaAuth(OKTA_CONFIG);

const App: FC = () => {
  useLokaliseTranslation(['general', 'validations']);
  const { modules, isInitialized, user } = useAuth();
  const canViewCustomReports = useCommunityFeature(
    CommunityFeature.CUSTOM_REPORTS_MODULE_VISIBLE,
  );
  const content = useRoutes(
    routes(canViewCustomReports, modules) as RouteObject[],
  );
  const navigate = useNavigate();

  useScrollReset();
  setupYup();

  // we need this to stop a warning from okta https://github.com/okta/okta-react/issues/227#issuecomment-1167375982
  useEffect(
    () => () => {
      oktaAuth.options.restoreOriginalUri = undefined;
    },
    [],
  );

  const restoreOriginalUri = (_oktaAuth: OktaAuth, originalUri: string) => {
    navigate(toRelativeUrl(originalUri || '/', window.location.origin), {
      replace: true,
    });
  };

  useTimeInModules();
  useTimeInApp();
  const iconsFetched = useIconsRefetch();
  useTokenManagerHandlers();

  return (
    <OktaProvider
      oktaAuth={oktaAuth}
      restoreOriginalUri={restoreOriginalUri}
    >
      <MsalProvider instance={pca}>
        <GoogleOAuthProvider clientId={import.meta.env.VITE_GOOGLE_CLIENT_ID}>
          <LocalizationProvider
            dateAdapter={AdapterDateFns}
            adapterLocale={getCurrentLocale(user)}
          >
            <NuqsAdapter>
              <ErrorBoundary>
                <GlobalStyles additionalStyles={GLOBAL_STYLES_OVERRIDES} />
                <MaintenanceGuard>
                  {isInitialized && iconsFetched ? (
                    content
                  ) : (
                    <LoadingScreen>
                      <Image
                        src={HuLogo}
                        alt="logo"
                        sx={{
                          height: LOGO_DIMENSIONS,
                          width: LOGO_DIMENSIONS,
                        }}
                      />
                    </LoadingScreen>
                  )}
                  <InactivityTimer />
                  <TopModal />
                </MaintenanceGuard>
              </ErrorBoundary>
            </NuqsAdapter>
          </LocalizationProvider>
        </GoogleOAuthProvider>
      </MsalProvider>
    </OktaProvider>
  );
};

export default App;
