import 'package:flutter/foundation.dart';
import 'package:hive_flutter/hive_flutter.dart';

// Importations conditionnelles pour le web vs non-web
import 'js_interface.dart';
import 'package:geosector_app/core/constants/app_keys.dart';
import 'package:geosector_app/core/data/models/user_model.dart';
import 'package:geosector_app/core/data/models/amicale_model.dart';
import 'package:geosector_app/core/data/models/client_model.dart';
import 'package:geosector_app/core/data/models/operation_model.dart';
import 'package:geosector_app/core/data/models/sector_model.dart';
import 'package:geosector_app/core/data/models/passage_model.dart';
import 'package:geosector_app/core/data/models/membre_model.dart';
import 'package:geosector_app/core/data/models/user_sector_model.dart';
import 'package:geosector_app/core/data/models/region_model.dart';
import 'package:geosector_app/chat/models/room.dart';
import 'package:geosector_app/chat/models/message.dart';

/// Service pour réinitialiser et recréer les Hive Boxes
/// Utilisé pour résoudre les problèmes d'incompatibilité après mise à jour des modèles
class HiveResetService {
  /// Réinitialise complètement Hive et recrée les boîtes nécessaires
  static Future<bool> resetAndRecreateHiveBoxes() async {
    try {
      debugPrint(
          'HiveResetService: Début de la réinitialisation complète de Hive');

      // Approche plus radicale pour le web : supprimer directement IndexedDB
      if (kIsWeb) {
        // Utiliser JavaScript pour supprimer complètement la base de données IndexedDB
        evalJs('''
          (function() {
            return new Promise(function(resolve, reject) {
              // Fermer toutes les connexions IndexedDB
              if (window.indexedDB) {
                console.log("Suppression complète d'IndexedDB...");
                var request = indexedDB.deleteDatabase("geosector_app");
                request.onsuccess = function() { 
                  console.log("IndexedDB supprimé avec succès"); 
                  resolve(true);
                };
                request.onerror = function(event) { 
                  console.log("Erreur lors de la suppression d'IndexedDB", event); 
                  reject(event);
                };
              } else {
                console.log("IndexedDB n'est pas disponible");
                resolve(false);
              }
            });
          })();
        ''');

        // Attendre un peu pour s'assurer que la suppression est terminée
        await Future.delayed(const Duration(milliseconds: 1000));

        // Réinitialiser Hive
        await Hive.initFlutter();
      } else {
        // Pour les plateformes mobiles, on utilise une approche différente
        await Hive.deleteFromDisk();
        await Hive.initFlutter();
      }

      // Réenregistrer tous les adaptateurs
      _registerAdapters();

      // Rouvrir les boîtes essentielles
      await _reopenEssentialBoxes();

      debugPrint(
          'HiveResetService: Réinitialisation complète terminée avec succès');
      return true;
    } catch (e) {
      debugPrint('HiveResetService: Erreur lors de la réinitialisation: $e');
      return false;
    }
  }

  /// Enregistre tous les adaptateurs Hive
  static void _registerAdapters() {
    debugPrint('HiveResetService: Enregistrement des adaptateurs Hive');

    // Enregistrer les adaptateurs pour les modèles principaux
    Hive.registerAdapter(UserModelAdapter());
    Hive.registerAdapter(AmicaleModelAdapter());
    Hive.registerAdapter(ClientModelAdapter());
    Hive.registerAdapter(OperationModelAdapter());
    Hive.registerAdapter(SectorModelAdapter());
    Hive.registerAdapter(PassageModelAdapter());
    Hive.registerAdapter(MembreModelAdapter());
    Hive.registerAdapter(UserSectorModelAdapter());

    // Enregistrer les adaptateurs pour le chat
    Hive.registerAdapter(RoomAdapter());
    Hive.registerAdapter(MessageAdapter());

    // Vérifier si RegionModelAdapter est disponible
    try {
      Hive.registerAdapter(RegionModelAdapter());
    } catch (e) {
      debugPrint('HiveResetService: RegionModelAdapter non disponible: $e');
    }
  }

  /// Rouvre les boîtes essentielles
  static Future<void> _reopenEssentialBoxes() async {
    debugPrint('HiveResetService: Réouverture des boîtes essentielles');

    // Ouvrir les boîtes essentielles au démarrage
    await Hive.openBox<UserModel>(AppKeys.userBoxName);
    await Hive.openBox<AmicaleModel>(AppKeys.amicaleBoxName);
    await Hive.openBox<ClientModel>(AppKeys.clientsBoxName);
    await Hive.openBox(AppKeys.settingsBoxName);

    // Ouvrir les boîtes de chat
    await Hive.openBox<Room>(AppKeys.chatRoomsBoxName);
    await Hive.openBox<Message>(AppKeys.chatMessagesBoxName);
  }
}
