import 'package:flutter/foundation.dart';
import 'package:geosector_app/core/constants/app_keys.dart';
import 'package:geosector_app/core/data/models/region_model.dart';
import 'package:hive_flutter/hive_flutter.dart';

class RegionRepository extends ChangeNotifier {
  late Box<RegionModel> _regionBox;
  List<RegionModel> _regions = [];
  bool _isLoaded = false;

  // Getter pour les régions
  List<RegionModel> get regions => _regions;
  bool get isLoaded => _isLoaded;

  // Initialisation du repository
  Future<void> init() async {
    if (!Hive.isBoxOpen(AppKeys.regionsBoxName)) {
      _regionBox = await Hive.openBox<RegionModel>(AppKeys.regionsBoxName);
    } else {
      _regionBox = Hive.box<RegionModel>(AppKeys.regionsBoxName);
    }
    _loadRegions();
  }

  // Chargement des régions depuis la boîte Hive
  void _loadRegions() {
    _regions = _regionBox.values.toList();
    _isLoaded = true;
    notifyListeners();
  }

  // Mise à jour des régions depuis l'API
  Future<void> updateRegionsFromApi(List<dynamic> regionsData) async {
    await _regionBox.clear();

    for (var regionData in regionsData) {
      final region = RegionModel.fromJson(regionData);
      await _regionBox.put(region.id, region);
    }

    _loadRegions();
  }

  // Récupérer une région par son ID
  RegionModel? getRegionById(int id) {
    return _regionBox.get(id);
  }

  // Récupérer une région par son code postal (2 premiers chiffres)
  RegionModel? getRegionByPostalCode(String postalCode) {
    if (postalCode.length < 2) return null;

    final departement = postalCode.substring(0, 2);

    for (var region in _regions) {
      if (region.departements != null &&
          region.departements!.split(',').contains(departement)) {
        return region;
      }
    }

    return null;
  }

  // Récupérer toutes les régions actives
  List<RegionModel> getActiveRegions() {
    return _regions.where((region) => region.chkActive).toList();
  }

  // Convertir les régions en format pour le dropdown
  List<Map<String, dynamic>> getRegionsForDropdown() {
    return _regions
        .where((region) => region.chkActive)
        .map((region) => {
              'id': region.id,
              'name': region.libelle,
            })
        .toList();
  }

  // Fermeture de la boîte Hive
  Future<void> close() async {
    await _regionBox.close();
  }
}
