"""
Localization Models — Country, Province, City, Language, Currency, Timezone, Calendar.

هر ماژول و سرویس برای فرمت اعداد، تاریخ، ارز و زبان از این مدل‌ها استفاده می‌کند.
"""
import uuid

from django.conf import settings
from django.db import models


# ─── Choices ─────────────────────────────────────────────────────────────


class TextDirection(models.TextChoices):
    RTL = 'rtl', 'Right to Left'
    LTR = 'ltr', 'Left to Right'


class NumberFormat(models.TextChoices):
    LATIN = 'latin', 'Latin (0-9)'
    PERSIAN = 'persian', 'Persian (۰-۹)'
    ARABIC = 'arabic', 'Arabic (٠-٩)'


class CurrencyPosition(models.TextChoices):
    BEFORE = 'before', 'Before Amount'
    AFTER = 'after', 'After Amount'


# ─── Country ─────────────────────────────────────────────────────────────


class Country(models.Model):
    """کشور — شامل اطلاعات جغرافیایی و پیش‌شماره تلفن."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100, verbose_name='نام')
    name_en = models.CharField(max_length=100, verbose_name='Name (English)')
    iso2 = models.CharField(max_length=2, unique=True, verbose_name='ISO 3166-1 alpha-2')
    iso3 = models.CharField(max_length=3, unique=True, verbose_name='ISO 3166-1 alpha-3')
    phone_code = models.CharField(max_length=10, verbose_name='Phone Code')
    flag_emoji = models.CharField(max_length=10, blank=True, verbose_name='Flag Emoji')
    is_active = models.BooleanField(default=True)
    sort_order = models.IntegerField(default=0)

    class Meta:
        db_table = 'loc_countries'
        verbose_name = 'Country'
        verbose_name_plural = 'Countries'
        ordering = ['sort_order', 'name']

    def __str__(self):
        return f"{self.flag_emoji} {self.name} ({self.iso2})"


# ─── Province ────────────────────────────────────────────────────────────


class Province(models.Model):
    """استان / ایالت."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    country = models.ForeignKey(
        Country, on_delete=models.CASCADE, related_name='provinces'
    )
    name = models.CharField(max_length=100, verbose_name='نام')
    name_en = models.CharField(max_length=100, verbose_name='Name (English)')
    code = models.CharField(max_length=10, blank=True)

    class Meta:
        db_table = 'loc_provinces'
        verbose_name = 'Province'
        verbose_name_plural = 'Provinces'
        ordering = ['name']
        unique_together = [('country', 'code')]

    def __str__(self):
        return self.name


# ─── City ────────────────────────────────────────────────────────────────


class City(models.Model):
    """شهر."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    province = models.ForeignKey(
        Province, on_delete=models.CASCADE, related_name='cities'
    )
    name = models.CharField(max_length=100, verbose_name='نام')
    name_en = models.CharField(max_length=100, verbose_name='Name (English)')
    code = models.CharField(max_length=10, blank=True)

    class Meta:
        db_table = 'loc_cities'
        verbose_name = 'City'
        verbose_name_plural = 'Cities'
        ordering = ['name']

    def __str__(self):
        return self.name


# ─── Language ────────────────────────────────────────────────────────────


class Language(models.Model):
    """زبان — شامل جهت نوشتار، فرمت اعداد و فونت."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100, verbose_name='نام')
    name_en = models.CharField(max_length=100, verbose_name='Name (English)')
    code = models.CharField(max_length=10, unique=True, verbose_name='ISO 639-1')
    locale_code = models.CharField(max_length=20, blank=True, verbose_name='Locale Code')
    direction = models.CharField(
        max_length=3,
        choices=TextDirection.choices,
        default=TextDirection.LTR,
    )
    number_format = models.CharField(
        max_length=10,
        choices=NumberFormat.choices,
        default=NumberFormat.LATIN,
    )
    font_family = models.CharField(max_length=100, blank=True)
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = 'loc_languages'
        verbose_name = 'Language'
        verbose_name_plural = 'Languages'
        ordering = ['name']

    def __str__(self):
        return f"{self.name} ({self.code})"


# ─── Currency ────────────────────────────────────────────────────────────


class Currency(models.Model):
    """ارز — شامل نماد، فرمت و جداکننده."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100, verbose_name='نام')
    name_en = models.CharField(max_length=100, verbose_name='Name (English)')
    code = models.CharField(max_length=10, unique=True, verbose_name='ISO 4217')
    symbol = models.CharField(max_length=10, blank=True)
    decimal_places = models.IntegerField(default=0)
    thousand_separator = models.CharField(max_length=5, default=',')
    decimal_separator = models.CharField(max_length=5, default='.')
    position = models.CharField(
        max_length=10,
        choices=CurrencyPosition.choices,
        default=CurrencyPosition.AFTER,
    )
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = 'loc_currencies'
        verbose_name = 'Currency'
        verbose_name_plural = 'Currencies'
        ordering = ['name']

    def __str__(self):
        return f"{self.name} ({self.code})"


# ─── Timezone ────────────────────────────────────────────────────────────


class Timezone(models.Model):
    """منطقه زمانی."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100, verbose_name='نام')
    name_en = models.CharField(max_length=100, verbose_name='Name (English)')
    identifier = models.CharField(max_length=60, unique=True, verbose_name='IANA Identifier')
    utc_offset = models.CharField(max_length=10, verbose_name='UTC Offset')
    country = models.ForeignKey(
        Country, on_delete=models.CASCADE, related_name='timezones',
        null=True, blank=True,
    )

    class Meta:
        db_table = 'loc_timezones'
        verbose_name = 'Timezone'
        verbose_name_plural = 'Timezones'
        ordering = ['utc_offset', 'name']

    def __str__(self):
        return f"{self.name} ({self.identifier})"


# ─── Calendar System ────────────────────────────────────────────────────


class CalendarSystem(models.Model):
    """سیستم تقویم (شمسی، میلادی، قمری)."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100, verbose_name='نام')
    name_en = models.CharField(max_length=100, verbose_name='Name (English)')
    code = models.CharField(max_length=20, unique=True)
    country = models.ForeignKey(
        Country, on_delete=models.SET_NULL, null=True, blank=True,
        related_name='calendars',
    )
    is_default = models.BooleanField(default=False)

    class Meta:
        db_table = 'loc_calendars'
        verbose_name = 'Calendar System'
        verbose_name_plural = 'Calendar Systems'

    def __str__(self):
        return f"{self.name} ({self.code})"


# ─── User Locale Preference ─────────────────────────────────────────────


class UserLocalePreference(models.Model):
    """تنظیمات محلی‌سازی کاربر — اگر null باشد از Tenant default استفاده می‌شود."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='locale_preference',
    )
    language = models.ForeignKey(
        Language, on_delete=models.SET_NULL, null=True, blank=True,
        related_name='user_preferences',
    )
    timezone = models.ForeignKey(
        Timezone, on_delete=models.SET_NULL, null=True, blank=True,
        related_name='user_preferences',
    )
    calendar = models.ForeignKey(
        CalendarSystem, on_delete=models.SET_NULL, null=True, blank=True,
        related_name='user_preferences',
    )
    currency = models.ForeignKey(
        Currency, on_delete=models.SET_NULL, null=True, blank=True,
        related_name='user_preferences',
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'loc_user_preferences'
        verbose_name = 'User Locale Preference'
        verbose_name_plural = 'User Locale Preferences'

    def __str__(self):
        return f"Locale prefs for {self.user}"
