# core/utils.py
from __future__ import annotations

from typing import Optional

from django.conf import settings as dj_settings
from django.db.models import Q

from customermanagement.models import Customer  # local import to avoid circular
from core.models import ApiMessage, AppSettings, Language


def get_or_create_app_settings(customer):
    app_settings, _ = AppSettings.objects.get_or_create(customer_user=customer)
    return app_settings


def _get_language_from_request(request) -> Optional[Language]:
    """
    Determine preferred language in priority order:
    1) accept-language header (exact code match)
    2) request.user -> customer -> app_settings.language
    3) None
    """
    if not request:
        return None

    # 1) Header
    try:
        lang_code = (request.headers.get("accept-language") or "").strip().lower()
    except Exception:
        lang_code = ""

    if lang_code:
        lang = Language.objects.filter(code=lang_code).first()
        if lang:
            return lang

    # 2) Customer AppSettings language
    try:
        user = getattr(request, "user", None)
        customer = None
        # Some auth returns Customer directly

        if isinstance(user, Customer):
            customer = user
        else:
            customer = getattr(user, "customer", None)

        if customer:
            app_settings = AppSettings.objects.select_related("language").filter(customer_user=customer).first()
            if app_settings and app_settings.language:
                return app_settings.language
    except Exception:
        pass

    return None


def _get_default_language() -> Optional[Language]:
    # Prefer "en" as default
    default_lang = Language.objects.filter(code="en").first()
    if default_lang:
        return default_lang
    # Any language if en isn't present
    return Language.objects.order_by("id").first()


def get_api_message(message_key: str, request=None) -> str:
    """
    Fetch a localized message from core.ApiMessage by message_key + language.
    Fallback: request language -> default language -> message_key.
    """
    if not message_key:
        return ""

    lang = _get_language_from_request(request)
    if lang:
        msg = ApiMessage.objects.filter(
            message_key=message_key,
            language=lang,
            is_active=True,
        ).first()
        if msg and msg.message:
            return msg.message

    default_lang = _get_default_language()
    if default_lang:
        msg = ApiMessage.objects.filter(
            message_key=message_key,
            language=default_lang,
            is_active=True,
        ).first()
        if msg and msg.message:
            return msg.message

    return message_key

