"""
Localization Service — دریافت locale فعال با ترکیب User + Tenant defaults.
"""
import logging

from .models import (
    CalendarSystem,
    Country,
    Currency,
    Language,
    Timezone,
    UserLocalePreference,
)

logger = logging.getLogger('apps')


class LocalizationService:
    """
    سرویس مرکزی محلی‌سازی.
    
    اولویت تنظیمات:
    1. تنظیمات شخصی کاربر (UserLocalePreference)
    2. تنظیمات Tenant
    3. مقادیر پیش‌فرض پلتفرم
    """

    # Platform defaults
    DEFAULT_LANGUAGE_CODE = 'fa'
    DEFAULT_TIMEZONE_ID = 'Asia/Tehran'
    DEFAULT_CURRENCY_CODE = 'IRR'
    DEFAULT_CALENDAR_CODE = 'jalali'
    DEFAULT_COUNTRY_ISO2 = 'IR'

    @classmethod
    def get_active_locale(cls, user=None, tenant=None):
        """
        دریافت locale فعال با ترکیب User → Tenant → Platform defaults.
        
        Returns:
            dict: شامل language, timezone, calendar, currency, country
        """
        user_pref = None
        if user and hasattr(user, 'locale_preference'):
            try:
                user_pref = user.locale_preference
            except UserLocalePreference.DoesNotExist:
                pass

        # Language
        language = None
        if user_pref and user_pref.language:
            language = user_pref.language
        elif tenant:
            language = cls._get_tenant_language(tenant)
        if not language:
            language = Language.objects.filter(code=cls.DEFAULT_LANGUAGE_CODE).first()

        # Timezone
        tz = None
        if user_pref and user_pref.timezone:
            tz = user_pref.timezone
        elif tenant:
            tz = cls._get_tenant_timezone(tenant)
        if not tz:
            tz = Timezone.objects.filter(identifier=cls.DEFAULT_TIMEZONE_ID).first()

        # Calendar
        calendar = None
        if user_pref and user_pref.calendar:
            calendar = user_pref.calendar
        if not calendar:
            calendar = CalendarSystem.objects.filter(code=cls.DEFAULT_CALENDAR_CODE).first()

        # Currency
        currency = None
        if user_pref and user_pref.currency:
            currency = user_pref.currency
        elif tenant:
            currency = cls._get_tenant_currency(tenant)
        if not currency:
            currency = Currency.objects.filter(code=cls.DEFAULT_CURRENCY_CODE).first()

        # Country
        country = None
        if tenant:
            country = cls._get_tenant_country(tenant)
        if not country:
            country = Country.objects.filter(iso2=cls.DEFAULT_COUNTRY_ISO2).first()

        return {
            'language': language,
            'timezone': tz,
            'calendar': calendar,
            'currency': currency,
            'country': country,
        }

    @classmethod
    def _get_tenant_language(cls, tenant):
        """دریافت زبان پیش‌فرض Tenant."""
        code = getattr(tenant, 'default_language', None)
        if code:
            return Language.objects.filter(code=code).first()
        return None

    @classmethod
    def _get_tenant_timezone(cls, tenant):
        """دریافت timezone پیش‌فرض Tenant."""
        identifier = getattr(tenant, 'timezone', None)
        if identifier:
            return Timezone.objects.filter(identifier=identifier).first()
        return None

    @classmethod
    def _get_tenant_currency(cls, tenant):
        """دریافت ارز پیش‌فرض Tenant."""
        code = getattr(tenant, 'currency', None)
        if code:
            return Currency.objects.filter(code=code).first()
        return None

    @classmethod
    def _get_tenant_country(cls, tenant):
        """دریافت کشور پیش‌فرض Tenant."""
        iso2 = getattr(tenant, 'country', None)
        if iso2:
            return Country.objects.filter(iso2=iso2).first()
        return None

    @classmethod
    def format_number(cls, number, language=None):
        """فرمت عدد بر اساس زبان."""
        if not language:
            language = Language.objects.filter(code=cls.DEFAULT_LANGUAGE_CODE).first()

        if not language:
            return str(number)

        num_str = str(number)

        if language.number_format == 'persian':
            persian_digits = '۰۱۲۳۴۵۶۷۸۹'
            return ''.join(
                persian_digits[int(c)] if c.isdigit() else c
                for c in num_str
            )
        elif language.number_format == 'arabic':
            arabic_digits = '٠١٢٣٤٥٦٧٨٩'
            return ''.join(
                arabic_digits[int(c)] if c.isdigit() else c
                for c in num_str
            )
        return num_str

    @classmethod
    def format_currency(cls, amount, currency=None):
        """فرمت مبلغ با ارز."""
        if not currency:
            currency = Currency.objects.filter(code=cls.DEFAULT_CURRENCY_CODE).first()

        if not currency:
            return str(amount)

        # Format number with separators
        if currency.decimal_places > 0:
            formatted = f"{amount:,.{currency.decimal_places}f}"
        else:
            formatted = f"{int(amount):,}"

        # Replace separators
        formatted = formatted.replace(',', '__THOUSAND__')
        formatted = formatted.replace('.', currency.decimal_separator)
        formatted = formatted.replace('__THOUSAND__', currency.thousand_separator)

        # Position symbol
        if currency.position == 'before':
            return f"{currency.symbol}{formatted}"
        return f"{formatted} {currency.symbol}"
