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

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

  useEffect(() => {
    if (window.location.hostname === '0.0.0.0') {
      window.location.hostname = 'localhost'
    }

    generateBunkerDelegatedKey()

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

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

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

      saveNsecBunkerDelegatedKey(newDelegatedKey)
    }
  }

  const handleRootRedirect = () => {
    if (authState.loggedIn) return appPrivateRoutes.homePage
    const callbackPathEncoded = btoa(
      window.location.href.split(`${window.location.origin}/#`)[1]
    )
    return `${appPublicRoutes.login}?callbackPath=${callbackPathEncoded}`
  }

  return (
    <Routes>
      <Route element={<MainLayout />}>
        {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}
              />
            )
          }
        })}

        <Route path="*" element={<Navigate to={handleRootRedirect()} />} />
      </Route>
    </Routes>
  )
}

export default App
