"""
Language and currency switching views.
"""
from django.shortcuts import redirect
from django.conf import settings
from django.http import JsonResponse
from django.utils.translation import activate
from django.views.decorators.http import require_http_methods


@require_http_methods(["GET", "POST"])
def set_language(request, language=None):
    """
    Set the user's preferred language.
    """
    if language is None:
        language = request.POST.get('language') or request.GET.get('language', settings.LANGUAGE_CODE)
    
    # Validate language
    valid_languages = dict(settings.LANGUAGES)
    if language not in valid_languages:
        language = settings.LANGUAGE_CODE
    
    # Store language in session
    request.session['django_language'] = language
    request.session.modified = True

    # Persist the preferred language to the authenticated user profile
    if request.user.is_authenticated:
        request.user.preferred_language = language
        request.user.save(update_fields=['preferred_language'])
    
    # Activate language for current request
    activate(language)
    
    # Get the referer or default to home
    next_url = request.META.get('HTTP_REFERER', '/')
    
    return redirect(next_url)


@require_http_methods(["GET", "POST"])
def set_currency(request, currency=None):
    """
    Set the user's preferred currency.
    """
    if currency is None:
        currency = request.POST.get('currency') or request.GET.get('currency', settings.DEFAULT_CURRENCY)
    
    # Validate currency
    if currency not in settings.CURRENCIES:
        currency = settings.DEFAULT_CURRENCY
    
    # Store currency in session
    request.session['currency'] = currency
    request.session.modified = True
    
    # Get the referer or default to home
    next_url = request.META.get('HTTP_REFERER', '/')
    
    return redirect(next_url)


def get_available_languages_json(request):
    """
    Return available languages as JSON with their currency mappings.
    """
    lang_currency_map = getattr(settings, 'LANGUAGE_CURRENCY_MAPPING', {})
    
    languages_data = [
        {
            'code': code,
            'name': name,
            'currency': lang_currency_map.get(code, settings.DEFAULT_CURRENCY),
        }
        for code, name in settings.LANGUAGES
    ]
    
    current_language = request.session.get('django_language', None)
    if request.user.is_authenticated:
        current_language = getattr(request.user, 'preferred_language', current_language)

    return JsonResponse({
        'languages': languages_data,
        'current_language': current_language or settings.LANGUAGE_CODE,
        'current_currency': request.session.get('currency', settings.DEFAULT_CURRENCY),
        'preferred_language': getattr(request.user, 'preferred_language', None) if request.user.is_authenticated else None,
    })
