import { useEffect } from 'react'
import { useSelector } from 'react-redux'
import { Route, Routes } from 'react-router-dom'
import { AuthController, NostrController } from './controllers'
import { MainLayout } from './layouts/Main'
import { LandingPage } from './pages/landing/LandingPage'
import { privateRoutes, publicRoutes } from './routes'
import { State } from './store/rootReducer'
import { getNsecBunkerDelegatedKey, saveNsecBunkerDelegatedKey } from './utils'

const App = () => {
  const authState = useSelector((state: State) => state.auth)

  useEffect(() => {
    generateBunkerDelegatedKey()

    const authController = new AuthController()
    authController.checkSession()
  }, [])

  const generateBunkerDelegatedKey = () => {
    const existingKey = getNsecBunkerDelegatedKey()

    if (!existingKey) {
      const nostrController = NostrController.getInstance()
      const newDelegatedKey = nostrController.generateDelegatedKey()

      saveNsecBunkerDelegatedKey(newDelegatedKey)
    }
  }

  return (
    <Routes>
      <Route element={<MainLayout />}>
        {authState?.loggedIn && <Route path='/' element={<LandingPage />} />}
        {authState?.loggedIn &&
          privateRoutes.map((route, index) => (
            <Route
              key={route.path + index}
              path={route.path}
              element={route.element}
            />
          ))}
        {publicRoutes.map((route, index) => {
          if (authState?.loggedIn) {
            if (!route.hiddenWhenLoggedIn) {
              return (
                <Route
                  key={route.path + index}
                  path={route.path}
                  element={route.element}
                />
              )
            }
          } else {
            return (
              <Route
                key={route.path + index}
                path={route.path}
                element={route.element}
              />
            )
          }
        })}
        {!authState ||
          (!authState.loggedIn && <Route path='*' element={<LandingPage />} />)}
      </Route>
    </Routes>
  )
}

export default App
