from __future__ import annotations

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response

from simorgh.apps.localization.models import Country, Language, Locale, Timezone
from simorgh.apps.localization.selectors import resolve_locale


@api_view(["GET"])
@permission_classes([AllowAny])
def countries_list(request: Request) -> Response:
    """Return enabled countries ordered by sort_order."""
    qs = Country.objects.filter(is_enabled=True).values(
        "id", "iso2", "iso3", "name_english", "name_native", "dial_code", "flag_emoji", "sort_order"
    )
    return Response(list(qs))


@api_view(["GET"])
@permission_classes([AllowAny])
def languages_list(request: Request) -> Response:
    """Return enabled languages for user preference dropdowns (public for login page)."""
    qs = Language.objects.filter(is_enabled=True).values(
        "id", "code", "name_english", "name_native", "direction", "sort_order"
    )
    return Response(list(qs))


@api_view(["GET"])
@permission_classes([IsAuthenticated])
def timezones_list(request: Request) -> Response:
    """Return enabled timezones for user preference dropdowns."""
    qs = Timezone.objects.filter(is_enabled=True).values(
        "id", "name", "display_name", "utc_offset", "sort_order"
    )
    return Response(list(qs))


@api_view(["GET"])
@permission_classes([IsAuthenticated])
def locales_list(request: Request) -> Response:
    """Return enabled locales for user preference dropdowns."""
    qs = (
        Locale.objects.select_related("language", "country")
        .filter(language__is_enabled=True)
        .values(
            "id",
            "code",
            "language__code",
            "language__name_english",
            "language__name_native",
            "language__direction",
            "country__iso2",
            "country__name_english",
            "calendar",
            "direction",
            "numeral_system",
            "date_format",
            "time_format",
            "currency_code",
            "timezone",
            "first_day_of_week",
            "is_default",
        )
    )
    return Response(list(qs))


@api_view(["GET"])
@permission_classes([IsAuthenticated])
def active_locale(request: Request) -> Response:
    """GET /api/v1/localization/active/

    Returns the resolved locale for the current request context, including
    all formatting patterns, currency, calendar, and direction.
    """
    tenant = getattr(request, "tenant", None)
    loc = resolve_locale(user=request.user, tenant=tenant)

    return Response({
        "code": loc.code,
        "language_code": loc.language.code if loc.language_id else "en",
        "language_name_native": loc.language.name_native if loc.language_id else "",
        "language_name_english": loc.language.name_english if loc.language_id else "",
        "country_iso2": loc.country.iso2 if loc.country_id else "",
        "country_name": loc.country.name_english if loc.country_id else "",
        "calendar": loc.effective_calendar,
        "direction": loc.effective_direction,
        "numeral_system": loc.effective_numeral_system,
        "date_format": loc.date_format,
        "time_format": loc.time_format,
        "datetime_format": loc.datetime_format,
        "first_day_of_week": loc.first_day_of_week,
        "number_decimal_separator": loc.number_decimal_separator,
        "number_thousand_separator": loc.number_thousand_separator,
        "currency_code": loc.currency_code,
        "timezone": loc.timezone,
    })
