import { BrowserRouter as Router, Navigate, Route, Routes } from 'react-router-dom'
import { lazy, memo, Suspense } from 'react'

import { RootPathContext } from '@asb/context'
import SuspenseFallback from '@components/SuspenseFallback'
import { NoAccessComponent } from '@utils'

import '@styles/App.less'

const UserOutlet = lazy(() => import('@components/outlets/UserOutlet'))
const DepositsOutlet = lazy(() => import('@components/outlets/DepositsOutlet'))
const LayoutPortal = lazy(() => import('@components/LayoutPortal'))

const Login = lazy(() => import('@pages/public/Login'))
const Register = lazy(() => import('@pages/public/Register'))
const FileDownload = lazy(() => import('@pages/FileDownload'))

const AdminPanel = lazy(() => import('@pages/AdminPanel'))
const Deposit = lazy(() => import('@pages/Deposit'))
const Cluster = lazy(() => import('@pages/Cluster'))
const Well = lazy(() => import('@pages/Well'))

export const App = memo(() => (
    <RootPathContext.Provider value={''}>
        <Suspense fallback={<SuspenseFallback style={{ minHeight: '100vh' }} />}>
            <Router>
                <Routes>
                    <Route index element={<Navigate to={'deposit'} replace />} />
                    <Route path={'*'} element={<NoAccessComponent />} />

                    {/* Public pages */}
                    <Route path={'/login'} element={<Login />} />
                    <Route path={'/register'} element={<Register />} />

                    {/* User pages */}
                    <Route element={<UserOutlet />}>
                        <Route path={'/file_download/:idFile/*'} element={<FileDownload />} />

                        <Route element={<DepositsOutlet />}>
                            <Route element={<LayoutPortal />}>
                                {/* Admin pages */}
                                <Route path={'/admin/*'} element={<AdminPanel />} />

                                {/* Client pages */}
                                <Route path={'/deposit/*'} element={<Deposit />} />
                                <Route path={'/cluster/:idCluster'} element={<Cluster />} />
                                <Route path={'/well/:idWell/*'} element={<Well />} />
                            </Route>
                        </Route>
                    </Route>
                </Routes>
            </Router>
        </Suspense>
    </RootPathContext.Provider>
))

export default App
