// Side-effect first: routes every Alert.alert through the themed dialog host
// before anything in the app can show one.
import './src/utils/appAlert';
import React, { useEffect } from 'react';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { useFonts, Poppins_400Regular, Poppins_500Medium, Poppins_600SemiBold, Poppins_700Bold, Poppins_800ExtraBold } from '@expo-google-fonts/poppins';
import { ActivityIndicator, View, StyleSheet, AppState } from 'react-native';
import { AuthProvider } from './src/context/AuthContext';
import { ThemeProvider } from './src/context/ThemeContext';
import { PreferenceProvider } from './src/context/PreferenceContext';
import AppNavigator from './src/navigation/AppNavigator';
import ToastHost from './src/components/ui/Toast';
import AlertHost from './src/components/ui/AlertHost';
import UpdateGate from './src/components/UpdateGate';
import { scheduleMorningBrief } from './src/services/MorningBriefService';
import { processOfflineQueue, startNetworkListener } from './src/services/SyncService';
// Side-effect import: registers the background location task with
// TaskManager at app start. Registering it later (from a screen) is too late
// for Android's headless JS process.
import './src/services/LocationTask';
import { COLORS } from './src/config/tokens';

export default function App() {
  const [fontsLoaded] = useFonts({
    Poppins_400Regular,
    Poppins_500Medium,
    Poppins_600SemiBold,
    Poppins_700Bold,
    Poppins_800ExtraBold,
  });

  useEffect(() => {
    startNetworkListener();
    // Flush anything queued during the previous session right away.
    processOfflineQueue().catch(() => {});
    const interval = setInterval(() => {
      processOfflineQueue().catch(() => {});
    }, 30000);
    // Reschedule the daily morning brief with fresh content on open and
    // whenever the app returns to the foreground (content goes stale in a
    // daily trigger otherwise).
    scheduleMorningBrief().catch(() => {});
    const appStateSub = AppState.addEventListener('change', (state) => {
      if (state !== 'active') return;
      scheduleMorningBrief().catch(() => {});
      // Returning to the foreground is the cheapest moment to retry anything
      // queued while we were in the background — the drain itself is also the
      // connectivity probe (successes flip connectivity back to online).
      processOfflineQueue().catch(() => {});
    });
    return () => {
      clearInterval(interval);
      appStateSub.remove();
    };
  }, []);

  if (!fontsLoaded) {
    return (
      <View style={styles.loader}>
        <ActivityIndicator size="large" color={COLORS.brand} />
      </View>
    );
  }

  return (
    <SafeAreaProvider>
      <AuthProvider>
        <ThemeProvider>
          <PreferenceProvider>
            <AppNavigator />
            <ToastHost />
            {/* Themed replacement for Alert.alert — sync results, confirms. */}
            <AlertHost />
            {/* Update prompt fires only after sign-in (see UpdateGate). */}
            <UpdateGate />
          </PreferenceProvider>
        </ThemeProvider>
      </AuthProvider>
    </SafeAreaProvider>
  );
}

const styles = StyleSheet.create({
  loader: {
    flex: 1, justifyContent: 'center', alignItems: 'center',
    backgroundColor: COLORS.background,
  },
});
