"""Šalių sąrašo paruošimas DB.

Naudojame `pycountry` ISO 3166 sąrašui, papildomai – statinį žemėlapį, kuris
nurodo Google Trends `pn` reikšmes ir kelias laiko juostas / pagrindines kalbas.

Ne visoms šalims Google Trends turi `trending_searches` palaikymą – paliekame
None, ir kolektorius tiesiog praleis tokias šalis.
"""

from __future__ import annotations

from dataclasses import dataclass
from typing import Optional

import pycountry

from .database import DatabaseHandler
from .logger import get_logger

log = get_logger(__name__)


# Google Trends `pn` reikšmės (pytrends.trending_searches)
PYTRENDS_PN = {
    "AR": "argentina", "AU": "australia", "AT": "austria", "BE": "belgium",
    "BR": "brazil", "CA": "canada", "CL": "chile", "CO": "colombia",
    "CZ": "czech_republic", "DK": "denmark", "EG": "egypt", "FI": "finland",
    "FR": "france", "DE": "germany", "GR": "greece", "HK": "hong_kong",
    "HU": "hungary", "IN": "india", "ID": "indonesia", "IE": "ireland",
    "IL": "israel", "IT": "italy", "JP": "japan", "KE": "kenya",
    "MY": "malaysia", "MX": "mexico", "NL": "netherlands", "NZ": "new_zealand",
    "NG": "nigeria", "NO": "norway", "PH": "philippines", "PL": "poland",
    "PT": "portugal", "RO": "romania", "RU": "russia", "SA": "saudi_arabia",
    "SG": "singapore", "ZA": "south_africa", "KR": "south_korea", "ES": "spain",
    "SE": "sweden", "CH": "switzerland", "TW": "taiwan", "TH": "thailand",
    "TR": "turkey", "UA": "ukraine", "GB": "united_kingdom", "US": "united_states",
    "VN": "vietnam",
}

# Apytikslės laiko juostos – pakanka grubiai (galima patobulinti per vietos DB)
TIMEZONES = {
    "LT": "Europe/Vilnius", "LV": "Europe/Riga", "EE": "Europe/Tallinn",
    "US": "America/New_York", "GB": "Europe/London", "JP": "Asia/Tokyo",
    "DE": "Europe/Berlin", "FR": "Europe/Paris", "IT": "Europe/Rome",
    "ES": "Europe/Madrid", "PL": "Europe/Warsaw", "FI": "Europe/Helsinki",
    "SE": "Europe/Stockholm", "NO": "Europe/Oslo", "DK": "Europe/Copenhagen",
    "NL": "Europe/Amsterdam", "BE": "Europe/Brussels", "CH": "Europe/Zurich",
    "AT": "Europe/Vienna", "GR": "Europe/Athens", "IE": "Europe/Dublin",
    "PT": "Europe/Lisbon", "CZ": "Europe/Prague", "HU": "Europe/Budapest",
    "UA": "Europe/Kyiv", "RU": "Europe/Moscow", "TR": "Europe/Istanbul",
    "BR": "America/Sao_Paulo", "AR": "America/Argentina/Buenos_Aires",
    "MX": "America/Mexico_City", "CA": "America/Toronto",
    "AU": "Australia/Sydney", "NZ": "Pacific/Auckland",
    "IN": "Asia/Kolkata", "ID": "Asia/Jakarta", "MY": "Asia/Kuala_Lumpur",
    "SG": "Asia/Singapore", "TH": "Asia/Bangkok", "VN": "Asia/Ho_Chi_Minh",
    "PH": "Asia/Manila", "KR": "Asia/Seoul", "TW": "Asia/Taipei",
    "HK": "Asia/Hong_Kong", "CN": "Asia/Shanghai", "IL": "Asia/Jerusalem",
    "SA": "Asia/Riyadh", "AE": "Asia/Dubai", "EG": "Africa/Cairo",
    "NG": "Africa/Lagos", "KE": "Africa/Nairobi", "ZA": "Africa/Johannesburg",
}

PRIMARY_LANG = {
    "LT": "lt", "LV": "lv", "EE": "et", "US": "en", "GB": "en",
    "JP": "ja", "DE": "de", "FR": "fr", "IT": "it", "ES": "es",
    "PL": "pl", "FI": "fi", "SE": "sv", "NO": "no", "DK": "da",
    "NL": "nl", "BE": "nl", "CH": "de", "AT": "de", "GR": "el",
    "IE": "en", "PT": "pt", "CZ": "cs", "HU": "hu", "UA": "uk",
    "RU": "ru", "TR": "tr", "BR": "pt", "AR": "es", "MX": "es",
    "CA": "en", "AU": "en", "NZ": "en", "IN": "en", "ID": "id",
    "MY": "ms", "SG": "en", "TH": "th", "VN": "vi", "PH": "en",
    "KR": "ko", "TW": "zh", "HK": "zh", "CN": "zh", "IL": "he",
    "SA": "ar", "AE": "ar", "EG": "ar", "NG": "en", "KE": "en",
    "ZA": "en", "RO": "ro", "BG": "bg", "SK": "sk", "SI": "sl",
    "HR": "hr", "RS": "sr", "IS": "is",
}


# Trumpas LT vertimas pasaulio šalims – aprėpiame populiariausias rankiniu būdu,
# kitoms imame ISO „common_name" / „name".
NAME_LT = {
    "LT": "Lietuva", "LV": "Latvija", "EE": "Estija",
    "US": "Jungtinės Amerikos Valstijos", "GB": "Jungtinė Karalystė",
    "JP": "Japonija", "DE": "Vokietija", "FR": "Prancūzija",
    "IT": "Italija", "ES": "Ispanija", "PL": "Lenkija",
    "FI": "Suomija", "SE": "Švedija", "NO": "Norvegija",
    "DK": "Danija", "NL": "Nyderlandai", "BE": "Belgija",
    "CH": "Šveicarija", "AT": "Austrija", "GR": "Graikija",
    "IE": "Airija", "PT": "Portugalija", "CZ": "Čekija",
    "HU": "Vengrija", "UA": "Ukraina", "RU": "Rusija",
    "TR": "Turkija", "BR": "Brazilija", "AR": "Argentina",
    "MX": "Meksika", "CA": "Kanada", "AU": "Australija",
    "NZ": "Naujoji Zelandija", "IN": "Indija", "ID": "Indonezija",
    "MY": "Malaizija", "SG": "Singapūras", "TH": "Tailandas",
    "VN": "Vietnamas", "PH": "Filipinai", "KR": "Pietų Korėja",
    "TW": "Taivanas", "HK": "Honkongas", "CN": "Kinija",
    "IL": "Izraelis", "SA": "Saudo Arabija", "AE": "Jungtiniai Arabų Emyratai",
    "EG": "Egiptas", "NG": "Nigerija", "KE": "Kenija", "ZA": "Pietų Afrika",
    "RO": "Rumunija", "BG": "Bulgarija", "SK": "Slovakija", "SI": "Slovėnija",
    "HR": "Kroatija", "RS": "Serbija", "IS": "Islandija",
}


@dataclass
class CountryInfo:
    iso2: str
    iso3: str
    name_en: str
    name_lt: str
    timezone: Optional[str]
    primary_language: Optional[str]
    pytrends_geo: Optional[str]


def iter_iso_countries() -> list[CountryInfo]:
    """Surenka visas ~250 ISO 3166-1 šalių."""
    out: list[CountryInfo] = []
    for c in pycountry.countries:
        iso2 = getattr(c, "alpha_2", None)
        if not iso2:
            continue
        name_en = getattr(c, "common_name", None) or c.name
        out.append(CountryInfo(
            iso2=iso2,
            iso3=getattr(c, "alpha_3", "") or "",
            name_en=name_en,
            name_lt=NAME_LT.get(iso2, name_en),
            timezone=TIMEZONES.get(iso2),
            primary_language=PRIMARY_LANG.get(iso2),
            pytrends_geo=PYTRENDS_PN.get(iso2),
        ))
    return out


def seed_countries(db: DatabaseHandler) -> int:
    """Užpildo countries lentelę visomis ISO šalimis (idempotenta)."""
    count = 0
    for ci in iter_iso_countries():
        db.upsert_country(
            iso_code=ci.iso2,
            iso_code3=ci.iso3,
            name_lt=ci.name_lt,
            name_en=ci.name_en,
            timezone=ci.timezone,
            primary_language=ci.primary_language,
            pytrends_geo=ci.pytrends_geo,
        )
        count += 1
    log.info("Užpildyta countries: %d", count)
    return count
