/// Provider pour gérer la locale de l'application
library locale_provider;

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

import '../utils/logger.dart';

/// Provider pour la gestion de la locale
class LocaleProvider extends ChangeNotifier {
  static const String _localeKey = 'app_locale';
  
  Locale _locale = const Locale('fr');
  
  /// Locale actuelle
  Locale get locale => _locale;
  
  /// Locales supportées
  static const List<Locale> supportedLocales = [
    Locale('fr'),
    Locale('en'),
  ];
  
  /// Initialiser la locale depuis les préférences
  Future<void> initialize() async {
    try {
      final prefs = await SharedPreferences.getInstance();
      final localeCode = prefs.getString(_localeKey);
      
      if (localeCode != null) {
        _locale = Locale(localeCode);
        AppLogger.info('Locale chargée: $localeCode');
      } else {
        AppLogger.info('Locale par défaut: fr');
      }
      
      notifyListeners();
    } catch (e, stackTrace) {
      AppLogger.error(
        'Erreur lors du chargement de la locale',
        error: e,
        stackTrace: stackTrace,
      );
    }
  }
  
  /// Changer la locale
  Future<void> setLocale(Locale locale) async {
    if (!supportedLocales.contains(locale)) {
      AppLogger.warning('Locale non supportée: ${locale.languageCode}');
      return;
    }
    
    if (_locale == locale) {
      return;
    }
    
    try {
      _locale = locale;
      notifyListeners();
      
      final prefs = await SharedPreferences.getInstance();
      await prefs.setString(_localeKey, locale.languageCode);
      
      AppLogger.info('Locale changée: ${locale.languageCode}');
      AppLogger.userAction('Change language', data: {'locale': locale.languageCode});
    } catch (e, stackTrace) {
      AppLogger.error(
        'Erreur lors du changement de locale',
        error: e,
        stackTrace: stackTrace,
      );
    }
  }
  
  /// Basculer entre FR et EN
  Future<void> toggleLocale() async {
    final newLocale = _locale.languageCode == 'fr' 
        ? const Locale('en') 
        : const Locale('fr');
    await setLocale(newLocale);
  }
  
  /// Obtenir le nom de la langue actuelle
  String get currentLanguageName {
    switch (_locale.languageCode) {
      case 'fr':
        return 'Français';
      case 'en':
        return 'English';
      default:
        return 'Français';
    }
  }
  
  /// Vérifier si la locale est française
  bool get isFrench => _locale.languageCode == 'fr';
  
  /// Vérifier si la locale est anglaise
  bool get isEnglish => _locale.languageCode == 'en';
}

