/// Configuration globale de l'injection de dépendances
library app_di;

import 'package:dio/dio.dart';
import 'package:get_it/get_it.dart';
import '../network/dio_client.dart';
import '../network/network_info.dart';
import '../../features/organizations/di/organizations_di.dart';
import '../../features/members/di/membres_di.dart';
import '../../features/events/di/evenements_di.dart';
import '../../features/contributions/di/contributions_di.dart';
import '../../features/dashboard/di/dashboard_di.dart';

/// Gestionnaire global des dépendances
class AppDI {
  static final GetIt _getIt = GetIt.instance;

  /// Initialise toutes les dépendances de l'application
  static Future<void> initialize() async {
    // Configuration du client HTTP
    await _setupNetworking();

    // Configuration des modules
    await _setupModules();
  }

  /// Configure les services réseau
  static Future<void> _setupNetworking() async {
    // Client Dio
    final dioClient = DioClient();
    _getIt.registerSingleton<DioClient>(dioClient);
    _getIt.registerSingleton<Dio>(dioClient.dio);

    // Network Info (pour l'instant, on simule toujours connecté)
    _getIt.registerLazySingleton<NetworkInfo>(
      () => _MockNetworkInfo(),
    );
  }

  /// Configure tous les modules de l'application
  static Future<void> _setupModules() async {
    // Module Organizations
    OrganizationsDI.registerDependencies();

    // Module Membres
    MembresDI.register();

    // Module Événements
    EvenementsDI.register();

    // Module Contributions
    registerCotisationsDependencies(_getIt);

    // Module Dashboard
    DashboardDI.registerDependencies();

    // TODO: Ajouter d'autres modules ici
    // SolidariteDI.registerDependencies();
    // RapportsDI.registerDependencies();
  }

  /// Nettoie toutes les dépendances
  static Future<void> dispose() async {
    // Nettoyer les modules
    OrganizationsDI.unregisterDependencies();
    MembresDI.unregister();
    EvenementsDI.unregister();

    // Nettoyer les services globaux
    if (_getIt.isRegistered<Dio>()) {
      _getIt.unregister<Dio>();
    }
    if (_getIt.isRegistered<DioClient>()) {
      _getIt.unregister<DioClient>();
    }

    // Reset complet
    await _getIt.reset();
  }

  /// Obtient l'instance GetIt
  static GetIt get instance => _getIt;

  /// Obtient le client Dio
  static Dio get dio => _getIt<Dio>();

  /// Obtient le client Dio wrapper
  static DioClient get dioClient => _getIt<DioClient>();

  /// Nettoie toutes les dépendances
  static Future<void> cleanup() async {
    await _getIt.reset();
  }
}

/// Mock de NetworkInfo pour les tests et développement
class _MockNetworkInfo implements NetworkInfo {
  @override
  Future<bool> get isConnected async => true;
}
