"""
Middleware pour gerer la langue de l'utilisateur en session

Ajoute `request.current_language` avec la langue courante.
"""

from django.utils import translation
from django.utils.deprecation import MiddlewareMixin

from .models import Language


class LanguageMiddleware(MiddlewareMixin):
    """
    Middleware pour gerer la langue courante de l'utilisateur

    La langue est stockee en session sous la cle 'current_language_code'.
    Si aucune langue n'est definie, utilise la langue par defaut.

    Ajoute a la request:
        - request.current_language: Instance Language courante
        - request.current_language_code: Code de la langue courante
    """

    SESSION_KEY = 'current_language_code'

    def process_request(self, request):
        """Ajoute la langue courante a la request"""
        # Verifier si une langue est demandee via GET
        lang_code = request.GET.get('lang')

        if lang_code:
            # Valider et sauvegarder en session
            try:
                language = Language.objects.get(code=lang_code, is_active=True)
                request.session[self.SESSION_KEY] = language.code
            except Language.DoesNotExist:
                pass

        # Recuperer la langue depuis la session
        lang_code = request.session.get(self.SESSION_KEY)

        if lang_code:
            try:
                language = Language.objects.get(code=lang_code, is_active=True)
            except Language.DoesNotExist:
                language = Language.get_default()
        else:
            language = Language.get_default()

        # Si toujours pas de langue, creer une langue par defaut fictive
        if not language:
            # Retourner un objet simple pour eviter les erreurs
            class DefaultLanguage:
                code = 'fr'
                name = 'Francais'
                is_default = True
            language = DefaultLanguage()

        request.current_language = language
        request.current_language_code = getattr(language, 'code', 'fr')

        # Activer la langue dans le systeme de traduction Django
        translation.activate(request.current_language_code)

        # Sauvegarder en session si pas deja fait
        if self.SESSION_KEY not in request.session:
            request.session[self.SESSION_KEY] = request.current_language_code

    def process_template_response(self, request, response):
        """Ajoute la langue au contexte du template"""
        if hasattr(response, 'context_data') and response.context_data is not None:
            response.context_data['current_language'] = getattr(request, 'current_language', None)
            response.context_data['current_language_code'] = getattr(request, 'current_language_code', 'fr')
            response.context_data['available_languages'] = Language.get_active_languages()
        return response


def set_language(request, language_code):
    """
    Fonction utilitaire pour changer la langue en session

    Args:
        request: HttpRequest
        language_code: Code de la langue (ex: 'fr', 'en')

    Returns:
        True si la langue a ete changee, False sinon
    """
    try:
        language = Language.objects.get(code=language_code, is_active=True)
        request.session[LanguageMiddleware.SESSION_KEY] = language.code
        request.current_language = language
        request.current_language_code = language.code
        return True
    except Language.DoesNotExist:
        return False


def get_current_language(request):
    """
    Recupere la langue courante depuis la request

    Args:
        request: HttpRequest

    Returns:
        Instance Language ou None
    """
    return getattr(request, 'current_language', None)


def get_current_language_code(request):
    """
    Recupere le code de la langue courante

    Args:
        request: HttpRequest

    Returns:
        Code de la langue (str) ou 'fr' par defaut
    """
    return getattr(request, 'current_language_code', 'fr')
