"""
Template tags et filtres pour l'app config.

Usage:
    {% load config_tags %}

    {{ "jp"|country_flag }}
    {{ country.code|country_flag:"w40" }}
    {{ "fr"|country_flag:"w20":"rounded" }}
"""
from django import template
from django.utils.safestring import mark_safe

register = template.Library()


# =============================================================================
# Mapping des codes pays vers noms (principaux pays)
# =============================================================================

COUNTRY_NAMES = {
    'ad': 'Andorre', 'ae': 'Émirats arabes unis', 'af': 'Afghanistan',
    'ag': 'Antigua-et-Barbuda', 'al': 'Albanie', 'am': 'Arménie',
    'ao': 'Angola', 'ar': 'Argentine', 'at': 'Autriche', 'au': 'Australie',
    'az': 'Azerbaïdjan', 'ba': 'Bosnie-Herzégovine', 'bb': 'Barbade',
    'bd': 'Bangladesh', 'be': 'Belgique', 'bf': 'Burkina Faso',
    'bg': 'Bulgarie', 'bh': 'Bahreïn', 'bi': 'Burundi', 'bj': 'Bénin',
    'bn': 'Brunei', 'bo': 'Bolivie', 'br': 'Brésil', 'bs': 'Bahamas',
    'bt': 'Bhoutan', 'bw': 'Botswana', 'by': 'Biélorussie', 'bz': 'Belize',
    'ca': 'Canada', 'cd': 'RD Congo', 'cf': 'Centrafrique', 'cg': 'Congo',
    'ch': 'Suisse', 'ci': "Côte d'Ivoire", 'cl': 'Chili', 'cm': 'Cameroun',
    'cn': 'Chine', 'co': 'Colombie', 'cr': 'Costa Rica', 'cu': 'Cuba',
    'cv': 'Cap-Vert', 'cy': 'Chypre', 'cz': 'Tchéquie', 'de': 'Allemagne',
    'dj': 'Djibouti', 'dk': 'Danemark', 'dm': 'Dominique', 'do': 'Rép. dominicaine',
    'dz': 'Algérie', 'ec': 'Équateur', 'ee': 'Estonie', 'eg': 'Égypte',
    'er': 'Érythrée', 'es': 'Espagne', 'et': 'Éthiopie', 'fi': 'Finlande',
    'fj': 'Fidji', 'fr': 'France', 'ga': 'Gabon', 'gb': 'Royaume-Uni',
    'gd': 'Grenade', 'ge': 'Géorgie', 'gh': 'Ghana', 'gm': 'Gambie',
    'gn': 'Guinée', 'gq': 'Guinée équatoriale', 'gr': 'Grèce',
    'gt': 'Guatemala', 'gw': 'Guinée-Bissau', 'gy': 'Guyana', 'hn': 'Honduras',
    'hr': 'Croatie', 'ht': 'Haïti', 'hu': 'Hongrie', 'id': 'Indonésie',
    'ie': 'Irlande', 'il': 'Israël', 'in': 'Inde', 'iq': 'Irak',
    'ir': 'Iran', 'is': 'Islande', 'it': 'Italie', 'jm': 'Jamaïque',
    'jo': 'Jordanie', 'jp': 'Japon', 'ke': 'Kenya', 'kg': 'Kirghizistan',
    'kh': 'Cambodge', 'ki': 'Kiribati', 'km': 'Comores', 'kn': 'Saint-Kitts-et-Nevis',
    'kp': 'Corée du Nord', 'kr': 'Corée du Sud', 'kw': 'Koweït',
    'kz': 'Kazakhstan', 'la': 'Laos', 'lb': 'Liban', 'lc': 'Sainte-Lucie',
    'li': 'Liechtenstein', 'lk': 'Sri Lanka', 'lr': 'Liberia', 'ls': 'Lesotho',
    'lt': 'Lituanie', 'lu': 'Luxembourg', 'lv': 'Lettonie', 'ly': 'Libye',
    'ma': 'Maroc', 'mc': 'Monaco', 'md': 'Moldavie', 'me': 'Monténégro',
    'mg': 'Madagascar', 'mh': 'Îles Marshall', 'mk': 'Macédoine du Nord',
    'ml': 'Mali', 'mm': 'Myanmar', 'mn': 'Mongolie', 'mr': 'Mauritanie',
    'mt': 'Malte', 'mu': 'Maurice', 'mv': 'Maldives', 'mw': 'Malawi',
    'mx': 'Mexique', 'my': 'Malaisie', 'mz': 'Mozambique', 'na': 'Namibie',
    'ne': 'Niger', 'ng': 'Nigeria', 'ni': 'Nicaragua', 'nl': 'Pays-Bas',
    'no': 'Norvège', 'np': 'Népal', 'nr': 'Nauru', 'nz': 'Nouvelle-Zélande',
    'om': 'Oman', 'pa': 'Panama', 'pe': 'Pérou', 'pg': 'Papouasie-Nouvelle-Guinée',
    'ph': 'Philippines', 'pk': 'Pakistan', 'pl': 'Pologne', 'pt': 'Portugal',
    'pw': 'Palaos', 'py': 'Paraguay', 'qa': 'Qatar', 'ro': 'Roumanie',
    'rs': 'Serbie', 'ru': 'Russie', 'rw': 'Rwanda', 'sa': 'Arabie saoudite',
    'sb': 'Îles Salomon', 'sc': 'Seychelles', 'sd': 'Soudan', 'se': 'Suède',
    'sg': 'Singapour', 'si': 'Slovénie', 'sk': 'Slovaquie', 'sl': 'Sierra Leone',
    'sm': 'Saint-Marin', 'sn': 'Sénégal', 'so': 'Somalie', 'sr': 'Suriname',
    'ss': 'Soudan du Sud', 'st': 'Sao Tomé-et-Príncipe', 'sv': 'Salvador',
    'sy': 'Syrie', 'sz': 'Eswatini', 'td': 'Tchad', 'tg': 'Togo',
    'th': 'Thaïlande', 'tj': 'Tadjikistan', 'tl': 'Timor oriental',
    'tm': 'Turkménistan', 'tn': 'Tunisie', 'to': 'Tonga', 'tr': 'Turquie',
    'tt': 'Trinité-et-Tobago', 'tv': 'Tuvalu', 'tw': 'Taïwan', 'tz': 'Tanzanie',
    'ua': 'Ukraine', 'ug': 'Ouganda', 'us': 'États-Unis', 'uy': 'Uruguay',
    'uz': 'Ouzbékistan', 'va': 'Vatican', 'vc': 'Saint-Vincent-et-les-Grenadines',
    've': 'Venezuela', 'vn': 'Vietnam', 'vu': 'Vanuatu', 'ws': 'Samoa',
    'ye': 'Yémen', 'za': 'Afrique du Sud', 'zm': 'Zambie', 'zw': 'Zimbabwe',
    # Territoires et régions
    'eu': 'Union européenne', 'un': 'Nations Unies',
}


def get_country_name(code):
    """Retourne le nom du pays pour un code donné."""
    code_lower = code.lower()

    # D'abord chercher dans le mapping local
    if code_lower in COUNTRY_NAMES:
        return COUNTRY_NAMES[code_lower]

    # Sinon chercher dans la base de données
    try:
        from config.models import Country
        country = Country.objects.filter(code__iexact=code).first()
        if country:
            return country.name
    except Exception:
        pass

    return code.upper()


@register.filter
def country_flag(code, size='w20'):
    """
    Retourne une balise img avec le drapeau du pays.

    Usage:
        {{ "jp"|country_flag }}
        {{ "fr"|country_flag:"w40" }}
        {{ country.code|country_flag:"w80" }}

    Tailles disponibles: w20, w40, w80, w160, w320, w640, w1280, w2560
    """
    if not code:
        return ''

    code_lower = str(code).lower().strip()
    country_name = get_country_name(code_lower)

    return mark_safe(
        f'<img src="https://flagcdn.com/{size}/{code_lower}.png" '
        f'alt="{country_name}" class="w-4 h-3 inline-block" />'
    )


@register.simple_tag
def flag_img(code, size='w20', css_class='w-4 h-3'):
    """
    Retourne une balise img avec le drapeau du pays (avec classe personnalisable).

    Usage:
        {% flag_img "jp" %}
        {% flag_img "fr" "w40" "w-6 h-4 rounded" %}
    """
    if not code:
        return ''

    code_lower = str(code).lower().strip()
    country_name = get_country_name(code_lower)

    return mark_safe(
        f'<img src="https://flagcdn.com/{size}/{code_lower}.png" '
        f'alt="{country_name}" class="{css_class}" />'
    )


@register.simple_tag
def flag_url(code, size='w20'):
    """
    Retourne uniquement l'URL du drapeau.

    Usage:
        {% flag_url "jp" as jp_flag %}
        <img src="{{ jp_flag }}" />
    """
    if not code:
        return ''

    code_lower = str(code).lower().strip()
    return f'https://flagcdn.com/{size}/{code_lower}.png'
