import { Dispatch, useEffect, useState } from 'react'
import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'
import { Stack } from "expo-router"
import { useColorScheme } from '@/hooks/useColorScheme'
import { StatusBar } from 'expo-status-bar'
import * as Location from 'expo-location'
import * as TaskManager from 'expo-task-manager'
import { Platform } from 'react-native'

TaskManager.defineTask("fetch-geolocation", async ({ data, error }: any) => {
  if (error) {
    console.error(error)
    return
  }
  const { locations } = data
  for (let location of locations) {
    console.log(location)
  }
 })

async function manageGelocation(setLocation: Dispatch<Location.LocationObject | null>) {
  await Location.enableNetworkProviderAsync().catch(error => alert(error))
  const { status: foregroundStatus } = await Location.requestForegroundPermissionsAsync()
  if (foregroundStatus === 'granted') {
    setLocation(await Location.getLastKnownPositionAsync())
    const { status: backgroundStatus } = await Location.requestBackgroundPermissionsAsync()
    if (backgroundStatus === 'granted') {
      if (Platform.OS !== "web") {
        if (!await Location.hasStartedLocationUpdatesAsync("fetch-geolocation")) {
          await Location.startLocationUpdatesAsync("fetch-geolocation", {
            accuracy: Location.Accuracy.BestForNavigation,
            activityType: Location.ActivityType.OtherNavigation,
            deferredUpdatesInterval: 100,
            foregroundService: {
              killServiceOnDestroy: false,
              notificationBody: "Géolocalisation activée pour « Traintrape-moi »",
              notificationTitle: "Traintrape-moi",
              notificationColor: "#FFFF00",
            }
          })
        }
      }
      else {
        await Location.watchPositionAsync({accuracy: Location.Accuracy.BestForNavigation}, location_nouveau => setLocation(location_nouveau))
      }
    }
    else {
      alert("Vous devez activer votre géolocalisation en arrière-plan pour utiliser l'application.")
    }
  }
  else {
    alert("Vous devez activer votre géolocalisation pour utiliser l'application.")
  }
}

export default function RootLayout() {
  const [location, setLocation] = useState<Location.LocationObject | null>(null)
  useEffect(() => {
    manageGelocation(setLocation)
    return () => {
      Location.stopLocationUpdatesAsync("fetch-geolocation")
    }
  }, [])

  const colorScheme = useColorScheme()

  return <ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
    <Stack>
      <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
      <Stack.Screen name="+not-found" />
    </Stack>
    <StatusBar style="auto" />
  </ThemeProvider>
}
