import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:geolocator/geolocator.dart';
import 'package:latlong2/latlong.dart';

/// Service de géolocalisation pour gérer les permissions et l'accès à la position
class LocationService {
  /// Vérifie si les services de localisation sont activés
  static Future<bool> isLocationServiceEnabled() async {
    // En version web, on considère que les services de localisation sont toujours activés
    // car la vérification est gérée différemment par le navigateur
    if (kIsWeb) {
      return true;
    }
    return await Geolocator.isLocationServiceEnabled();
  }

  /// Vérifie et demande les permissions de localisation
  /// Retourne true si l'autorisation est accordée, false sinon
  static Future<bool> checkAndRequestPermission() async {
    // En version web, on considère que les permissions sont toujours accordées
    // car la gestion des permissions est différente et gérée par le navigateur
    if (kIsWeb) {
      return true;
    }
    
    try {
      // Vérifier si les services de localisation sont activés
      bool serviceEnabled = await isLocationServiceEnabled();
      if (!serviceEnabled) {
        // Les services de localisation ne sont pas activés, on ne peut pas demander la permission
        return false;
      }

      // Vérifier le statut actuel de la permission
      LocationPermission permission = await Geolocator.checkPermission();
      
      if (permission == LocationPermission.denied) {
        // Demander la permission
        permission = await Geolocator.requestPermission();
        if (permission == LocationPermission.denied) {
          // La permission a été refusée
          return false;
        }
      }
      
      if (permission == LocationPermission.deniedForever) {
        // La permission a été refusée définitivement
        return false;
      }
      
      // La permission est accordée (whileInUse ou always)
      return true;
    } catch (e) {
      debugPrint('Erreur lors de la vérification des permissions de localisation: $e');
      // En cas d'erreur, on retourne false pour être sûr
      return false;
    }
  }

  /// Obtient la position actuelle de l'utilisateur
  /// Retourne null si la position ne peut pas être obtenue
  static Future<LatLng?> getCurrentPosition() async {
    try {
      // En version web, la géolocalisation fonctionne différemment
      // et peut être bloquée par le navigateur si le site n'est pas en HTTPS
      if (kIsWeb) {
        try {
          Position position = await Geolocator.getCurrentPosition(
            desiredAccuracy: LocationAccuracy.high,
          );
          return LatLng(position.latitude, position.longitude);
        } catch (e) {
          debugPrint('Erreur lors de l\'obtention de la position en version web: $e');
          // En version web, en cas d'erreur, on peut retourner une position par défaut
          // ou null selon les besoins de l'application
          return null;
        }
      }
      
      // Version mobile
      // Vérifier si l'autorisation est accordée
      bool hasPermission = await checkAndRequestPermission();
      if (!hasPermission) {
        return null;
      }
      
      // Obtenir la position actuelle
      Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high,
      );
      
      return LatLng(position.latitude, position.longitude);
    } catch (e) {
      debugPrint('Erreur lors de l\'obtention de la position: $e');
      return null;
    }
  }

  /// Vérifie si l'application peut accéder à la position de l'utilisateur
  /// Retourne un message d'erreur si l'accès n'est pas possible, null sinon
  static Future<String?> getLocationErrorMessage() async {
    // En version web, on considère qu'il n'y a pas d'erreur de localisation
    // car la gestion des permissions est gérée par le navigateur
    if (kIsWeb) {
      return null;
    }
    
    try {
      // Vérifier si les services de localisation sont activés
      bool serviceEnabled = await isLocationServiceEnabled();
      if (!serviceEnabled) {
        return 'Les services de localisation sont désactivés. Veuillez les activer dans les paramètres de votre appareil.';
      }

      // Vérifier le statut actuel de la permission
      LocationPermission permission = await Geolocator.checkPermission();
      
      if (permission == LocationPermission.denied) {
        return 'L\'accès à la localisation a été refusé. Cette application ne peut pas fonctionner sans cette autorisation.';
      }
      
      if (permission == LocationPermission.deniedForever) {
        return 'L\'accès à la localisation a été définitivement refusé. Veuillez l\'autoriser dans les paramètres de votre appareil.';
      }
      
      return null; // Pas d'erreur
    } catch (e) {
      debugPrint('Erreur lors de la vérification des erreurs de localisation: $e');
      // En cas d'erreur, on retourne null pour ne pas bloquer l'application
      return null;
    }
  }

  /// Ouvre les paramètres de l'application pour permettre à l'utilisateur de modifier les autorisations
  static Future<void> openAppSettings() async {
    // En version web, cette fonctionnalité n'est pas disponible
    if (kIsWeb) {
      debugPrint('Ouverture des paramètres de l\'application non disponible en version web');
      return;
    }
    
    try {
      await Geolocator.openAppSettings();
    } catch (e) {
      debugPrint('Erreur lors de l\'ouverture des paramètres de l\'application: $e');
    }
  }

  /// Ouvre les paramètres de localisation de l'appareil
  static Future<void> openLocationSettings() async {
    // En version web, cette fonctionnalité n'est pas disponible
    if (kIsWeb) {
      debugPrint('Ouverture des paramètres de localisation non disponible en version web');
      return;
    }
    
    try {
      await Geolocator.openLocationSettings();
    } catch (e) {
      debugPrint('Erreur lors de l\'ouverture des paramètres de localisation: $e');
    }
  }
}
