import { useReactNavigationDevTools } from '@dev-plugins/react-navigation'
import { useReactQueryDevTools } from '@dev-plugins/react-query'
import AsyncStorage from '@react-native-async-storage/async-storage'
import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'
import { QueryClient } from '@tanstack/react-query'
import { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister'
import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client'
import { Stack, useNavigationContainerRef } from 'expo-router'
import { StatusBar } from 'expo-status-bar'
import { MD3DarkTheme, MD3LightTheme, PaperProvider } from 'react-native-paper'
import { Provider as StoreProvider } from 'react-redux'
import GameProvider from '@/components/providers/GameProvider'
import GeolocationProvider from '@/components/providers/GeolocationProvider'
import LoginProvider from '@/components/providers/LoginProvider'
import { useColorScheme } from '@/hooks/useColorScheme'
import store from '@/utils/store'

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      gcTime: 24 * 60 * 60 * 1000,  // 24h
      staleTime: 2000,
      retry: 5,
    }
  }
})

export default function RootLayout() {
  const colorScheme = useColorScheme()

  const navigationRef = useNavigationContainerRef()
  useReactNavigationDevTools(navigationRef)
  useReactQueryDevTools(queryClient)

  const asyncStoragePersister = createAsyncStoragePersister({
    storage: AsyncStorage,
  })  

  return (
    <StoreProvider store={store}>
      <PersistQueryClientProvider
          client={queryClient}
          persistOptions={{ persister: asyncStoragePersister }}
          onSuccess={() => queryClient.resumePausedMutations().then(() => queryClient.invalidateQueries())}>
        <LoginProvider loginRedirect={'/login'}>
          <GeolocationProvider>
            <GameProvider>
              <PaperProvider
                  theme={colorScheme === 'dark' ? MD3DarkTheme : MD3LightTheme} >
                <ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
                  <Stack>
                    <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
                    <Stack.Screen name="login" options={{ headerShown: false }} />
                    <Stack.Screen name="challenges-list" options={{ headerShown: false }} />
                    <Stack.Screen name="+not-found" />
                  </Stack>
                  <StatusBar style="auto" />
                </ThemeProvider>
              </PaperProvider>
            </GameProvider>
          </GeolocationProvider>
        </LoginProvider>
      </PersistQueryClientProvider>
    </StoreProvider>
  )
}
