from functools import lru_cache
from datetime import datetime, tzinfo

import pytz # type: ignore

# https://gist.github.com/edwardabraham/8680198
tz_lookup = {
    pytz.timezone(x).localize(datetime.now()).tzname(): pytz.timezone(x)
    for x in pytz.all_timezones
}
tz_lookup['UTC'] = pytz.utc # ugh. otherwise it'z Zulu...


# TODO dammit, lru_cache interferes with mypy?
@lru_cache(None)
def abbr_to_timezone(abbr: str) -> tzinfo:
    return tz_lookup[abbr]


def zone_to_countrycode(zone: str) -> str:
    # todo make optional?
    return _zones_to_countrycode()[zone]


@lru_cache(1)
def _zones_to_countrycode():
    # https://stackoverflow.com/a/13020785/706389
    res = {}
    for countrycode, timezones in pytz.country_timezones.items():
        for timezone in timezones:
            res[timezone] = countrycode
    return res

from functools import lru_cache
from datetime import datetime, tzinfo

import pytz # type: ignore

# https://gist.github.com/edwardabraham/8680198
tz_lookup = {
    pytz.timezone(x).localize(datetime.now()).tzname(): pytz.timezone(x)
    for x in pytz.all_timezones
}
tz_lookup['UTC'] = pytz.utc # ugh. otherwise it'z Zulu...


# TODO dammit, lru_cache interferes with mypy?
@lru_cache(None)
def abbr_to_timezone(abbr: str) -> tzinfo:
    return tz_lookup[abbr]


def zone_to_countrycode(zone: str) -> str:
    # todo make optional?
    return _zones_to_countrycode()[zone]


@lru_cache(1)
def _zones_to_countrycode():
    # https://stackoverflow.com/a/13020785/706389
    res = {}
    for countrycode, timezones in pytz.country_timezones.items():
        for timezone in timezones:
            res[timezone] = countrycode
    return res

# type: ignore # https://gist.github.com/edwardabraham/8680198 # ugh. otherwise it'z Zulu... # TODO dammit, lru_cache interferes with mypy? # todo make optional? # https://stackoverflow.com/a/13020785/706389