import React, { useState, useEffect } from "react";
import { NavigationContainer } from "@react-navigation/native";

import navigationTheme from "./app/navigation/navigationTheme";
import "./app/config/globals.js";
import AppLoading from "expo-app-loading";
import FlashMessage from "react-native-flash-message";
import AppNavigator from "./app/navigation/AppNavigator";
import EventLocationProvider from "./app/context/EventLocationContext";
import CurrentLocationProvider from "./app/context/CurrentLocationContext";
import AuthNavigator from "./app/navigation/AuthNavigator";
import { AuthContext } from "./app/auth/context";
import authStorage from "./app/auth/storage";
import MapDataProvider from "./app/context/MapDataContext";
import { getLocation } from "./app/hooks/useLocation";
import { useFiltering } from "./app/hooks/useFiltering";
import NoInternetConnectionScreen from "./app/screens/NoInternetConnectionScreen";
import NetInfo, { useNetInfo } from "@react-native-community/netinfo";
import getPluviometerStation from "./app/hooks/usePluviometricStation";

export default function App() {
  const [user, setUser] = useState();
  const [pluviometerStation, setPluviometerStation] = useState(undefined);
  const [isReady, setIsReady] = useState();

  const netInfo = useNetInfo();

  useEffect(() => {
    if (user?.username != null) {
      if (pluviometerStation == undefined) {
        getPluviometerStation(user.id, setPluviometerStation);
      }
      authStorage.setUser(user);
    }
    else{
      setPluviometerStation(undefined);
    }
  }, [user]);

  useEffect(() => {
    if (user?.username != null) {
      setUser({ ...user, pluviometer: pluviometerStation });
    }
  }, [pluviometerStation]);

    console.log(pluviometerStation);

  const restoreUser = async () => {
    const storageUser = await authStorage.getUser();
    if (storageUser) setUser(storageUser);

    global.location = await getLocation();
  };

  if (!isReady && netInfo.isInternetReachable) {
    return (
      <AppLoading
        startAsync={restoreUser}
        onFinish={() => setIsReady(true)}
        onError={(e) => console.log(e)}
      />
    );
  } else if (netInfo.isInternetReachable) {
    global.formsSockets = useFiltering(global.location || global.defaultLocation);

    return (
      <AuthContext.Provider
        value={{
          user,
          setUser,
        }}
      >
        <CurrentLocationProvider>
          <EventLocationProvider>
            <MapDataProvider>
              <NavigationContainer theme={navigationTheme}>
                {user ? <AppNavigator /> : <AuthNavigator />}
                <FlashMessage position="top" />
              </NavigationContainer>
            </MapDataProvider>
          </EventLocationProvider>
        </CurrentLocationProvider>
      </AuthContext.Provider>
    );
  } else return <NoInternetConnectionScreen />;
}