import 'dart:async';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';

import '../firebase_options.dart';
import '../config/api_config.dart';
import 'cache_service.dart';

/// Service responsable des initialisations lourdes en tâche de fond.
///
/// Objectif : réduire au maximum le travail synchrone dans main(),
/// afficher immédiatement une UI minimale, puis effectuer l'init asynchrone.
class AppInitializer with ChangeNotifier {
  bool _isInitialized = false;
  bool _isInitializing = false;

  bool get isInitialized => _isInitialized;
  bool get isInitializing => _isInitializing;

  final CacheService cacheService = CacheService();

  /// Démarre l'initialisation asynchrone. Idempotent.
  Future<void> initialize() async {
    if (_isInitialized || _isInitializing) return;
    _isInitializing = true;
    scheduleMicrotask(() => notifyListeners());

    try {
      // Initialiser Firebase
      await Firebase.initializeApp(
        options: DefaultFirebaseOptions.currentPlatform,
      );

      // Configurer les émulateurs en dev si demandé
      if (ApiConfig.isDevelopment) {
        try {
          await FirebaseAuth.instance.useAuthEmulator('localhost', 9199);
          FirebaseFirestore.instance.useFirestoreEmulator('localhost', 8088);
        } catch (e) {
          // Ignorer si non supporté
          if (kDebugMode) print('Emulator setup failed: $e');
        }
      }

      // Initialiser le cache local sans bloquer l'écran de démarrage.
      unawaited(cacheService.init());

      // Précharger des assets critiques de façon asynchrone
      unawaited(_preloadAssets());

      // TODO: lancer ici d'autres initialisations non bloquantes

      _isInitialized = true;
      _isInitializing = false;
      notifyListeners();
    } catch (e, st) {
      if (kDebugMode) print('AppInitializer failed: $e\n$st');
      _isInitializing = false;
      // Ne rethrow pas pour éviter de planter l'app; laisser l'UI gérer les erreurs.
      notifyListeners();
    }
  }

  Future<void> _preloadAssets() async {
    try {
      // Charger quelques assets en mémoire pour rendre l'affichage initial fluide
      await rootBundle.load('assets/logos/RectangleLogoBlack.png');
      await rootBundle.load('assets/logos/SquareLogoWhite.png');
    } catch (e) {
      if (kDebugMode) print('Preload assets failed: $e');
    }
  }
}

