"""Localization architecture refactor.

Changes:
  - Country: add default_currency, default_calendar, default_direction,
    default_timezone, first_day_of_week, weekend_days
  - Language: remove default_calendar (now lives on Country);
    add numeral_system
  - Locale: add country FK, calendar override, direction override,
    numeral_system override; rename region → kept for data compat but
    replaced in practice by country FK
"""

from __future__ import annotations

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ("localization", "0003_add_timezone_model"),
    ]

    operations = [
        # ── Country: new localization-default fields ──────────────────────────
        migrations.AddField(
            model_name="country",
            name="default_currency",
            field=models.CharField(
                default="USD",
                help_text="ISO 4217 currency code, e.g. IRR, USD, EUR",
                max_length=8,
                verbose_name="default currency",
            ),
        ),
        migrations.AddField(
            model_name="country",
            name="default_calendar",
            field=models.CharField(
                choices=[
                    ("gregorian", "Gregorian"),
                    ("jalali", "Jalali (Solar Hijri)"),
                    ("hijri", "Hijri (Lunar)"),
                    ("fiscal", "Fiscal calendar"),
                ],
                default="gregorian",
                help_text="Calendar system used in this country (e.g. IR→jalali, SA→hijri)",
                max_length=16,
                verbose_name="default calendar",
            ),
        ),
        migrations.AddField(
            model_name="country",
            name="default_direction",
            field=models.CharField(
                choices=[("ltr", "Left-to-right"), ("rtl", "Right-to-left")],
                default="ltr",
                help_text="RTL/LTR default for this country's primary language",
                max_length=3,
                verbose_name="default direction",
            ),
        ),
        migrations.AddField(
            model_name="country",
            name="default_timezone",
            field=models.CharField(
                default="UTC",
                help_text="IANA timezone name, e.g. Asia/Tehran",
                max_length=64,
                verbose_name="default timezone",
            ),
        ),
        migrations.AddField(
            model_name="country",
            name="first_day_of_week",
            field=models.PositiveSmallIntegerField(
                default=0,
                help_text="0 = Monday … 6 = Sunday",
                verbose_name="first day of week",
            ),
        ),
        migrations.AddField(
            model_name="country",
            name="weekend_days",
            field=models.CharField(
                default="5,6",
                help_text="Comma-separated 0-6 values (0=Mon). E.g. '5,6'=Sat,Sun; '4,5'=Thu,Fri",
                max_length=20,
                verbose_name="weekend days",
            ),
        ),
        # ── Language: replace default_calendar with numeral_system ───────────
        migrations.RemoveField(
            model_name="language",
            name="default_calendar",
        ),
        migrations.AddField(
            model_name="language",
            name="numeral_system",
            field=models.CharField(
                choices=[
                    ("latin", "Latin (0-9)"),
                    ("eastern_arabic", "Eastern Arabic (٠-٩)"),
                    ("persian", "Persian (۰-۹)"),
                ],
                default="latin",
                help_text="Default numeral system used when writing in this language",
                max_length=20,
                verbose_name="numeral system",
            ),
        ),
        # ── Locale: add country FK + override fields ──────────────────────────
        migrations.AddField(
            model_name="locale",
            name="country",
            field=models.ForeignKey(
                blank=True,
                help_text="Country this locale is specific to (null = language-only locale)",
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="locales",
                to="localization.country",
                verbose_name="country",
            ),
        ),
        migrations.AddField(
            model_name="locale",
            name="calendar",
            field=models.CharField(
                blank=True,
                choices=[
                    ("gregorian", "Gregorian"),
                    ("jalali", "Jalali (Solar Hijri)"),
                    ("hijri", "Hijri (Lunar)"),
                    ("fiscal", "Fiscal calendar"),
                ],
                default="",
                help_text="Override calendar; blank = inherit from country.default_calendar",
                max_length=16,
                verbose_name="calendar",
            ),
        ),
        migrations.AddField(
            model_name="locale",
            name="direction",
            field=models.CharField(
                blank=True,
                choices=[("ltr", "Left-to-right"), ("rtl", "Right-to-left")],
                default="",
                help_text="Override direction; blank = inherit from language.direction",
                max_length=3,
                verbose_name="direction",
            ),
        ),
        migrations.AddField(
            model_name="locale",
            name="numeral_system",
            field=models.CharField(
                blank=True,
                choices=[
                    ("latin", "Latin (0-9)"),
                    ("eastern_arabic", "Eastern Arabic (٠-٩)"),
                    ("persian", "Persian (۰-۹)"),
                ],
                default="",
                help_text="Override numeral system; blank = inherit from language.numeral_system",
                max_length=20,
                verbose_name="numeral system",
            ),
        ),
        # ── Data migration: backfill Country defaults ─────────────────────────
        migrations.RunSQL(
            sql="""
            UPDATE localization_country SET
                default_currency = CASE iso2
                    WHEN 'IR' THEN 'IRR'
                    WHEN 'SA' THEN 'SAR'
                    WHEN 'AE' THEN 'AED'
                    WHEN 'IQ' THEN 'IQD'
                    WHEN 'AF' THEN 'AFN'
                    WHEN 'PK' THEN 'PKR'
                    WHEN 'IN' THEN 'INR'
                    WHEN 'CN' THEN 'CNY'
                    WHEN 'TR' THEN 'TRY'
                    WHEN 'DE' THEN 'EUR'
                    WHEN 'FR' THEN 'EUR'
                    WHEN 'GB' THEN 'GBP'
                    WHEN 'RU' THEN 'RUB'
                    WHEN 'JP' THEN 'JPY'
                    WHEN 'SG' THEN 'SGD'
                    WHEN 'AU' THEN 'AUD'
                    ELSE 'USD'
                END,
                default_calendar = CASE iso2
                    WHEN 'IR' THEN 'jalali'
                    WHEN 'AF' THEN 'jalali'
                    WHEN 'SA' THEN 'hijri'
                    WHEN 'IQ' THEN 'hijri'
                    ELSE 'gregorian'
                END,
                default_direction = CASE iso2
                    WHEN 'IR' THEN 'rtl'
                    WHEN 'SA' THEN 'rtl'
                    WHEN 'AE' THEN 'rtl'
                    WHEN 'IQ' THEN 'rtl'
                    WHEN 'AF' THEN 'rtl'
                    WHEN 'PK' THEN 'rtl'
                    ELSE 'ltr'
                END,
                default_timezone = CASE iso2
                    WHEN 'IR' THEN 'Asia/Tehran'
                    WHEN 'SA' THEN 'Asia/Riyadh'
                    WHEN 'AE' THEN 'Asia/Dubai'
                    WHEN 'IQ' THEN 'Asia/Baghdad'
                    WHEN 'AF' THEN 'Asia/Kabul'
                    WHEN 'PK' THEN 'Asia/Karachi'
                    WHEN 'IN' THEN 'Asia/Kolkata'
                    WHEN 'CN' THEN 'Asia/Shanghai'
                    WHEN 'TR' THEN 'Europe/Istanbul'
                    WHEN 'DE' THEN 'Europe/Berlin'
                    WHEN 'FR' THEN 'Europe/Paris'
                    WHEN 'GB' THEN 'Europe/London'
                    WHEN 'RU' THEN 'Europe/Moscow'
                    WHEN 'JP' THEN 'Asia/Tokyo'
                    WHEN 'SG' THEN 'Asia/Singapore'
                    WHEN 'AU' THEN 'Australia/Sydney'
                    WHEN 'US' THEN 'America/New_York'
                    ELSE 'UTC'
                END,
                first_day_of_week = CASE iso2
                    WHEN 'IR' THEN 5
                    WHEN 'AF' THEN 5
                    WHEN 'SA' THEN 6
                    WHEN 'IQ' THEN 6
                    WHEN 'AE' THEN 0
                    WHEN 'US' THEN 6
                    ELSE 0
                END,
                weekend_days = CASE iso2
                    WHEN 'IR' THEN '4,5'
                    WHEN 'AF' THEN '4,5'
                    WHEN 'SA' THEN '5,6'
                    WHEN 'IQ' THEN '5,6'
                    WHEN 'AE' THEN '5,6'
                    WHEN 'US' THEN '5,6'
                    ELSE '5,6'
                END
            """,
            reverse_sql=migrations.RunSQL.noop,
        ),
        # ── Data migration: backfill Language.numeral_system ──────────────────
        migrations.RunSQL(
            sql="""
            UPDATE localization_language SET numeral_system = CASE code
                WHEN 'fa' THEN 'persian'
                WHEN 'ar' THEN 'eastern_arabic'
                ELSE 'latin'
            END
            """,
            reverse_sql=migrations.RunSQL.noop,
        ),
        # ── Locale: remove old region CharField (replaced by country FK) ──────
        migrations.RemoveField(
            model_name="locale",
            name="region",
        ),
    ]
