"""
Timezone information for the dateutil parser

All credit to https://github.com/prefrontal/dateutil-parser-timezones
"""

# from dateutil.tz import gettz
from datetime import datetime

from pytz import timezone


def assemble_timezones():
    """
    Assembles a dictionary of timezone abbreviations and values
    :return: Dictionary of abbreviation keys and timezone values
    """
    timezones = {}

    timezones["ACDT"] = timezone(
        "Australia/Darwin"
    )  # Australian Central Daylight Savings Time (UTC+10:30)
    timezones["ACST"] = timezone(
        "Australia/Darwin"
    )  # Australian Central Standard Time (UTC+09:30)
    timezones["ACT"] = timezone("Brazil/Acre")  # Acre Time (UTC−05)
    timezones["ADT"] = timezone("America/Halifax")  # Atlantic Daylight Time (UTC−03)
    timezones["AEDT"] = timezone(
        "Australia/Sydney"
    )  # Australian Eastern Daylight Savings Time (UTC+11)
    timezones["AEST"] = timezone("Australia/Sydney")  # Australian Eastern Standard Time (UTC+10)
    timezones["AFT"] = timezone("Asia/Kabul")  # Afghanistan Time (UTC+04:30)
    timezones["AKDT"] = timezone("America/Juneau")  # Alaska Daylight Time (UTC−08)
    timezones["AKST"] = timezone("America/Juneau")  # Alaska Standard Time (UTC−09)
    timezones["AMST"] = timezone("America/Manaus")  # Amazon Summer Time (Brazil)[1] (UTC−03)
    timezones["AMT"] = timezone("America/Manaus")  # Amazon Time (Brazil)[2] (UTC−04)
    timezones["ART"] = timezone("America/Cordoba")  # Argentina Time (UTC−03)
    timezones["AST"] = timezone("Asia/Riyadh")  # Arabia Standard Time (UTC+03)
    timezones["AWST"] = timezone("Australia/Perth")  # Australian Western Standard Time (UTC+08)
    timezones["AZOST"] = timezone("Atlantic/Azores")  # Azores Summer Time (UTC±00)
    timezones["AZOT"] = timezone("Atlantic/Azores")  # Azores Standard Time (UTC−01)
    timezones["AZT"] = timezone("Asia/Baku")  # Azerbaijan Time (UTC+04)
    timezones["BDT"] = timezone("Asia/Brunei")  # Brunei Time (UTC+08)
    timezones["BIOT"] = timezone("Etc/GMT+6")  # British Indian Ocean Time (UTC+06)
    timezones["BIT"] = timezone("Pacific/Funafuti")  # Baker Island Time (UTC−12)
    timezones["BOT"] = timezone("America/La_Paz")  # Bolivia Time (UTC−04)
    timezones["BRST"] = timezone("America/Sao_Paulo")  # Brasilia Summer Time (UTC−02)
    timezones["BRT"] = timezone("America/Sao_Paulo")  # Brasilia Time (UTC−03)
    timezones["BST"] = timezone("Asia/Dhaka")  # Bangladesh Standard Time (UTC+06)
    timezones["BTT"] = timezone("Asia/Thimphu")  # Bhutan Time (UTC+06)
    timezones["CAT"] = timezone("Africa/Harare")  # Central Africa Time (UTC+02)
    timezones["CCT"] = timezone("Indian/Cocos")  # Cocos Islands Time (UTC+06:30)
    timezones["CDT"] = timezone(
        "America/Chicago"
    )  # Central Daylight Time (North America) (UTC−05)
    timezones["CEST"] = timezone(
        "Europe/Berlin"
    )  # Central European Summer Time (Cf. HAEC) (UTC+02)
    timezones["CET"] = timezone("Europe/Berlin")  # Central European Time (UTC+01)
    timezones["CHADT"] = timezone("Pacific/Chatham")  # Chatham Daylight Time (UTC+13:45)
    timezones["CHAST"] = timezone("Pacific/Chatham")  # Chatham Standard Time (UTC+12:45)
    timezones["CHOST"] = timezone("Asia/Choibalsan")  # Choibalsan Summer Time (UTC+09)
    timezones["CHOT"] = timezone("Asia/Choibalsan")  # Choibalsan Standard Time (UTC+08)
    timezones["CHST"] = timezone("Pacific/Guam")  # Chamorro Standard Time (UTC+10)
    timezones["CHUT"] = timezone("Pacific/Chuuk")  # Chuuk Time (UTC+10)
    timezones["CIST"] = timezone("Etc/GMT-8")  # Clipperton Island Standard Time (UTC−08)
    timezones["CIT"] = timezone("Asia/Makassar")  # Central Indonesia Time (UTC+08)
    timezones["CKT"] = timezone("Pacific/Rarotonga")  # Cook Island Time (UTC−10)
    timezones["CLST"] = timezone("America/Santiago")  # Chile Summer Time (UTC−03)
    timezones["CLT"] = timezone("America/Santiago")  # Chile Standard Time (UTC−04)
    timezones["COST"] = timezone("America/Bogota")  # Colombia Summer Time (UTC−04)
    timezones["COT"] = timezone("America/Bogota")  # Colombia Time (UTC−05)
    timezones["CST"] = timezone(
        "America/Chicago"
    )  # Central Standard Time (North America) (UTC−06)
    timezones["CT"] = timezone("Asia/Chongqing")  # China time (UTC+08)
    timezones["CVT"] = timezone("Atlantic/Cape_Verde")  # Cape Verde Time (UTC−01)
    timezones["CXT"] = timezone("Indian/Christmas")  # Christmas Island Time (UTC+07)
    timezones["DAVT"] = timezone("Antarctica/Davis")  # Davis Time (UTC+07)
    timezones["DDUT"] = timezone("Antarctica/DumontDUrville")  # Dumont d'Urville Time (UTC+10)
    timezones["DFT"] = timezone(
        "Europe/Berlin"
    )  # AIX equivalent of Central European Time (UTC+01)
    timezones["EASST"] = timezone("Chile/EasterIsland")  # Easter Island Summer Time (UTC−05)
    timezones["EAST"] = timezone("Chile/EasterIsland")  # Easter Island Standard Time (UTC−06)
    timezones["EAT"] = timezone("Africa/Mogadishu")  # East Africa Time (UTC+03)
    timezones["ECT"] = timezone("America/Guayaquil")  # Ecuador Time (UTC−05)
    timezones["EDT"] = timezone(
        "America/New_York"
    )  # Eastern Daylight Time (North America) (UTC−04)
    timezones["EEST"] = timezone("Europe/Bucharest")  # Eastern European Summer Time (UTC+03)
    timezones["EET"] = timezone("Europe/Bucharest")  # Eastern European Time (UTC+02)
    timezones["EGST"] = timezone("America/Scoresbysund")  # Eastern Greenland Summer Time (UTC±00)
    timezones["EGT"] = timezone("America/Scoresbysund")  # Eastern Greenland Time (UTC−01)
    timezones["EIT"] = timezone("Asia/Jayapura")  # Eastern Indonesian Time (UTC+09)
    timezones["EST"] = timezone(
        "America/New_York"
    )  # Eastern Standard Time (North America) (UTC−05)
    timezones["FET"] = timezone("Europe/Minsk")  # Further-eastern European Time (UTC+03)
    timezones["FJT"] = timezone("Pacific/Fiji")  # Fiji Time (UTC+12)
    timezones["FKST"] = timezone("Atlantic/Stanley")  # Falkland Islands Summer Time (UTC−03)
    timezones["FKT"] = timezone("Atlantic/Stanley")  # Falkland Islands Time (UTC−04)
    timezones["FNT"] = timezone("Brazil/DeNoronha")  # Fernando de Noronha Time (UTC−02)
    timezones["GALT"] = timezone("Pacific/Galapagos")  # Galapagos Time (UTC−06)
    timezones["GAMT"] = timezone("Pacific/Gambier")  # Gambier Islands (UTC−09)
    timezones["GET"] = timezone("Asia/Tbilisi")  # Georgia Standard Time (UTC+04)
    timezones["GFT"] = timezone("America/Cayenne")  # French Guiana Time (UTC−03)
    timezones["GILT"] = timezone("Pacific/Tarawa")  # Gilbert Island Time (UTC+12)
    timezones["GIT"] = timezone("Pacific/Gambier")  # Gambier Island Time (UTC−09)
    timezones["GMT"] = timezone("GMT")  # Greenwich Mean Time (UTC±00)
    timezones["GST"] = timezone("Asia/Muscat")  # Gulf Standard Time (UTC+04)
    timezones["GYT"] = timezone("America/Guyana")  # Guyana Time (UTC−04)
    timezones["HADT"] = timezone("Pacific/Honolulu")  # Hawaii-Aleutian Daylight Time (UTC−09)
    timezones["HAEC"] = timezone("Europe/Paris")  # Heure Avancée d'Europe Centrale (CEST) (UTC+02)
    timezones["HAST"] = timezone("Pacific/Honolulu")  # Hawaii-Aleutian Standard Time (UTC−10)
    timezones["HKT"] = timezone("Asia/Hong_Kong")  # Hong Kong Time (UTC+08)
    timezones["HMT"] = timezone("Indian/Kerguelen")  # Heard and McDonald Islands Time (UTC+05)
    timezones["HOVST"] = timezone("Asia/Hovd")  # Khovd Summer Time (UTC+08)
    timezones["HOVT"] = timezone("Asia/Hovd")  # Khovd Standard Time (UTC+07)
    timezones["ICT"] = timezone("Asia/Ho_Chi_Minh")  # Indochina Time (UTC+07)
    timezones["IDT"] = timezone("Asia/Jerusalem")  # Israel Daylight Time (UTC+03)
    timezones["IOT"] = timezone("Etc/GMT+3")  # Indian Ocean Time (UTC+03)
    timezones["IRDT"] = timezone("Asia/Tehran")  # Iran Daylight Time (UTC+04:30)
    timezones["IRKT"] = timezone("Asia/Irkutsk")  # Irkutsk Time (UTC+08)
    timezones["IRST"] = timezone("Asia/Tehran")  # Iran Standard Time (UTC+03:30)
    timezones["IST"] = timezone("Asia/Kolkata")  # Indian Standard Time (UTC+05:30)
    timezones["JST"] = timezone("Asia/Tokyo")  # Japan Standard Time (UTC+09)
    timezones["KGT"] = timezone("Asia/Bishkek")  # Kyrgyzstan time (UTC+06)
    timezones["KOST"] = timezone("Pacific/Kosrae")  # Kosrae Time (UTC+11)
    timezones["KRAT"] = timezone("Asia/Krasnoyarsk")  # Krasnoyarsk Time (UTC+07)
    timezones["KST"] = timezone("Asia/Seoul")  # Korea Standard Time (UTC+09)
    timezones["LHST"] = timezone("Australia/Lord_Howe")  # Lord Howe Standard Time (UTC+10:30)
    timezones["LINT"] = timezone("Pacific/Kiritimati")  # Line Islands Time (UTC+14)
    timezones["MAGT"] = timezone("Asia/Magadan")  # Magadan Time (UTC+12)
    timezones["MART"] = timezone("Pacific/Marquesas")  # Marquesas Islands Time (UTC−09:30)
    timezones["MAWT"] = timezone("Antarctica/Mawson")  # Mawson Station Time (UTC+05)
    timezones["MDT"] = timezone(
        "America/Denver"
    )  # Mountain Daylight Time (North America) (UTC−06)
    timezones["MEST"] = timezone(
        "Europe/Paris"
    )  # Middle European Summer Time Same zone as CEST (UTC+02)
    timezones["MET"] = timezone("Europe/Berlin")  # Middle European Time Same zone as CET (UTC+01)
    timezones["MHT"] = timezone("Pacific/Kwajalein")  # Marshall Islands (UTC+12)
    timezones["MIST"] = timezone("Antarctica/Macquarie")  # Macquarie Island Station Time (UTC+11)
    timezones["MIT"] = timezone("Pacific/Marquesas")  # Marquesas Islands Time (UTC−09:30)
    timezones["MMT"] = timezone("Asia/Rangoon")  # Myanmar Standard Time (UTC+06:30)
    timezones["MSK"] = timezone("Europe/Moscow")  # Moscow Time (UTC+03)
    timezones["MST"] = timezone(
        "America/Denver"
    )  # Mountain Standard Time (North America) (UTC−07)
    timezones["MUT"] = timezone("Indian/Mauritius")  # Mauritius Time (UTC+04)
    timezones["MVT"] = timezone("Indian/Maldives")  # Maldives Time (UTC+05)
    timezones["MYT"] = timezone("Asia/Kuching")  # Malaysia Time (UTC+08)
    timezones["NCT"] = timezone("Pacific/Noumea")  # New Caledonia Time (UTC+11)
    timezones["NDT"] = timezone("Canada/Newfoundland")  # Newfoundland Daylight Time (UTC−02:30)
    timezones["NFT"] = timezone("Pacific/Norfolk")  # Norfolk Time (UTC+11)
    timezones["NPT"] = timezone("Asia/Kathmandu")  # Nepal Time (UTC+05:45)
    timezones["NST"] = timezone("Canada/Newfoundland")  # Newfoundland Standard Time (UTC−03:30)
    timezones["NT"] = timezone("Canada/Newfoundland")  # Newfoundland Time (UTC−03:30)
    timezones["NUT"] = timezone("Pacific/Niue")  # Niue Time (UTC−11)
    timezones["NZDT"] = timezone("Pacific/Auckland")  # New Zealand Daylight Time (UTC+13)
    timezones["NZST"] = timezone("Pacific/Auckland")  # New Zealand Standard Time (UTC+12)
    timezones["OMST"] = timezone("Asia/Omsk")  # Omsk Time (UTC+06)
    timezones["ORAT"] = timezone("Asia/Oral")  # Oral Time (UTC+05)
    timezones["PDT"] = timezone(
        "America/Los_Angeles"
    )  # Pacific Daylight Time (North America) (UTC−07)
    timezones["PET"] = timezone("America/Lima")  # Peru Time (UTC−05)
    timezones["PETT"] = timezone("Asia/Kamchatka")  # Kamchatka Time (UTC+12)
    timezones["PGT"] = timezone("Pacific/Port_Moresby")  # Papua New Guinea Time (UTC+10)
    timezones["PHOT"] = timezone("Pacific/Enderbury")  # Phoenix Island Time (UTC+13)
    timezones["PKT"] = timezone("Asia/Karachi")  # Pakistan Standard Time (UTC+05)
    timezones["PMDT"] = timezone(
        "America/Miquelon"
    )  # Saint Pierre and Miquelon Daylight time (UTC−02)
    timezones["PMST"] = timezone(
        "America/Miquelon"
    )  # Saint Pierre and Miquelon Standard Time (UTC−03)
    timezones["PONT"] = timezone("Pacific/Pohnpei")  # Pohnpei Standard Time (UTC+11)
    timezones["PST"] = timezone(
        "America/Los_Angeles"
    )  # Pacific Standard Time (North America) (UTC−08)
    timezones["PYST"] = timezone(
        "America/Asuncion"
    )  # Paraguay Summer Time (South America)[7] (UTC−03)
    timezones["PYT"] = timezone("America/Asuncion")  # Paraguay Time (South America)[8] (UTC−04)
    timezones["RET"] = timezone("Indian/Reunion")  # Réunion Time (UTC+04)
    timezones["ROTT"] = timezone("Antarctica/Rothera")  # Rothera Research Station Time (UTC−03)
    timezones["SAKT"] = timezone("Asia/Vladivostok")  # Sakhalin Island time (UTC+11)
    timezones["SAMT"] = timezone("Europe/Samara")  # Samara Time (UTC+04)
    timezones["SAST"] = timezone("Africa/Johannesburg")  # South African Standard Time (UTC+02)
    timezones["SBT"] = timezone("Pacific/Guadalcanal")  # Solomon Islands Time (UTC+11)
    timezones["SCT"] = timezone("Indian/Mahe")  # Seychelles Time (UTC+04)
    timezones["SGT"] = timezone("Asia/Singapore")  # Singapore Time (UTC+08)
    timezones["SLST"] = timezone("Asia/Colombo")  # Sri Lanka Standard Time (UTC+05:30)
    timezones["SRET"] = timezone("Asia/Srednekolymsk")  # Srednekolymsk Time (UTC+11)
    timezones["SRT"] = timezone("America/Paramaribo")  # Suriname Time (UTC−03)
    timezones["SST"] = timezone("Asia/Singapore")  # Singapore Standard Time (UTC+08)
    timezones["SYOT"] = timezone("Antarctica/Syowa")  # Showa Station Time (UTC+03)
    timezones["TAHT"] = timezone("Pacific/Tahiti")  # Tahiti Time (UTC−10)
    timezones["TFT"] = timezone("Indian/Kerguelen")  # Indian/Kerguelen (UTC+05)
    timezones["THA"] = timezone("Asia/Bangkok")  # Thailand Standard Time (UTC+07)
    timezones["TJT"] = timezone("Asia/Dushanbe")  # Tajikistan Time (UTC+05)
    timezones["TKT"] = timezone("Pacific/Fakaofo")  # Tokelau Time (UTC+13)
    timezones["TLT"] = timezone("Asia/Dili")  # Timor Leste Time (UTC+09)
    timezones["TMT"] = timezone("Asia/Ashgabat")  # Turkmenistan Time (UTC+05)
    timezones["TOT"] = timezone("Pacific/Tongatapu")  # Tonga Time (UTC+13)
    timezones["TVT"] = timezone("Pacific/Funafuti")  # Tuvalu Time (UTC+12)
    timezones["ULAST"] = timezone("Asia/Ulan_Bator")  # Ulaanbaatar Summer Time (UTC+09)
    timezones["ULAT"] = timezone("Asia/Ulan_Bator")  # Ulaanbaatar Standard Time (UTC+08)
    timezones["USZ1"] = timezone("Europe/Kaliningrad")  # Kaliningrad Time (UTC+02)
    timezones["UTC"] = timezone("UTC")  # Coordinated Universal Time (UTC±00)
    timezones["UYST"] = timezone("America/Montevideo")  # Uruguay Summer Time (UTC−02)
    timezones["UYT"] = timezone("America/Montevideo")  # Uruguay Standard Time (UTC−03)
    timezones["UZT"] = timezone("Asia/Tashkent")  # Uzbekistan Time (UTC+05)
    timezones["VET"] = timezone("America/Caracas")  # Venezuelan Standard Time (UTC−04)
    timezones["VLAT"] = timezone("Asia/Vladivostok")  # Vladivostok Time (UTC+10)
    timezones["VOLT"] = timezone("Europe/Volgograd")  # Volgograd Time (UTC+04)
    timezones["VOST"] = timezone("Antarctica/Vostok")  # Vostok Station Time (UTC+06)
    timezones["VUT"] = timezone("Pacific/Efate")  # Vanuatu Time (UTC+11)
    timezones["WAKT"] = timezone("Pacific/Wake")  # Wake Island Time (UTC+12)
    timezones["WAST"] = timezone("Africa/Lagos")  # West Africa Summer Time (UTC+02)
    timezones["WAT"] = timezone("Africa/Lagos")  # West Africa Time (UTC+01)
    timezones["WEST"] = timezone("Europe/London")  # Western European Summer Time (UTC+01)
    timezones["WET"] = timezone("Europe/London")  # Western European Time (UTC±00)
    timezones["WIT"] = timezone("Asia/Jakarta")  # Western Indonesian Time (UTC+07)
    timezones["WST"] = timezone("Australia/Perth")  # Western Standard Time (UTC+08)
    timezones["YAKT"] = timezone("Asia/Yakutsk")  # Yakutsk Time (UTC+09)
    timezones["YEKT"] = timezone("Asia/Yekaterinburg")  # Yekaterinburg Time (UTC+05)

    dt = datetime(2020, 1, 1)
    timezones.update((x, y.localize(dt).tzinfo) for x, y in timezones.items())
    return timezones
