from enum import Enum


class TimezoneEnum(str, Enum):
    utc: str = "UTC"
    abidjan: str = "Africa/Abidjan"
    accra: str = "Africa/Accra"
    addis_ababa: str = "Africa/Addis_Ababa"
    algiers: str = "Africa/Algiers"
    asmara: str = "Africa/Asmara"
    bamako: str = "Africa/Bamako"
    bangui: str = "Africa/Bangui"
    banjul: str = "Africa/Banjul"
    bissau: str = "Africa/Bissau"
    blantyre: str = "Africa/Blantyre"
    brazzaville: str = "Africa/Brazzaville"
    bujumbura: str = "Africa/Bujumbura"
    cairo: str = "Africa/Cairo"
    casablanca: str = "Africa/Casablanca"
    ceuta: str = "Africa/Ceuta"
    conakry: str = "Africa/Conakry"
    dakar: str = "Africa/Dakar"
    dar_es_salaam: str = "Africa/Dar_es_Salaam"
    djibouti: str = "Africa/Djibouti"
    douala: str = "Africa/Douala"
    el_aaiun: str = "Africa/El_Aaiun"
    freetown: str = "Africa/Freetown"
    gaborone: str = "Africa/Gaborone"
    harare: str = "Africa/Harare"
    johannesburg: str = "Africa/Johannesburg"
    juba: str = "Africa/Juba"
    kampala: str = "Africa/Kampala"
    khartoum: str = "Africa/Khartoum"
    kigali: str = "Africa/Kigali"
    kinshasa: str = "Africa/Kinshasa"
    lagos: str = "Africa/Lagos"
    libreville: str = "Africa/Libreville"
    lome: str = "Africa/Lome"
    luanda: str = "Africa/Luanda"
    lubumbashi: str = "Africa/Lubumbashi"
    lusaka: str = "Africa/Lusaka"
    malabo: str = "Africa/Malabo"
    maputo: str = "Africa/Maputo"
    maseru: str = "Africa/Maseru"
    mbabane: str = "Africa/Mbabane"
    mogadishu: str = "Africa/Mogadishu"
    monrovia: str = "Africa/Monrovia"
    nairobi: str = "Africa/Nairobi"
    ndjamena: str = "Africa/Ndjamena"
    niamey: str = "Africa/Niamey"
    nouakchott: str = "Africa/Nouakchott"
    ouagadougou: str = "Africa/Ouagadougou"
    porto_novo: str = "Africa/Porto-Novo"
    sao_tome: str = "Africa/Sao_Tome"
    tripoli: str = "Africa/Tripoli"
    tunis: str = "Africa/Tunis"
    windhoek: str = "Africa/Windhoek"
    adak: str = "America/Adak"
    anchorage: str = "America/Anchorage"
    anguilla: str = "America/Anguilla"
    antigua: str = "America/Antigua"
    aruba: str = "America/Aruba"
    araguaina: str = "America/Araguaina"
    buenos_aires: str = "America/Argentina/Buenos_Aires"
    catamarca: str = "America/Argentina/Catamarca"
    cordoba: str = "America/Argentina/Cordoba"
    jujuy: str = "America/Argentina/Jujuy"
    la_rioja: str = "America/Argentina/La_Rioja"
    mendoza: str = "America/Argentina/Mendoza"
    rio_gallegos: str = "America/Argentina/Rio_Gallegos"
    salta: str = "America/Argentina/Salta"
    san_juan: str = "America/Argentina/San_Juan"
    san_luis: str = "America/Argentina/San_Luis"
    tucuman: str = "America/Argentina/Tucuman"
    ushuaia: str = "America/Argentina/Ushuaia"
    asuncion: str = "America/Asuncion"
    atikokan: str = "America/Atikokan"
    bahia: str = "America/Bahia"
    bahia_banderas: str = "America/Bahia_Banderas"
    barbados: str = "America/Barbados"
    belem: str = "America/Belem"
    belize: str = "America/Belize"
    blanc_sablon: str = "America/Blanc-Sablon"
    boa_vista: str = "America/Boa_Vista"
    bogota: str = "America/Bogota"
    boise: str = "America/Boise"
    cambridge_bay: str = "America/Cambridge_Bay"
    campo_grande: str = "America/Campo_Grande"
    cancun: str = "America/Cancun"
    caracas: str = "America/Caracas"
    cayenne: str = "America/Cayenne"
    cayman: str = "America/Cayman"
    chicago: str = "America/Chicago"
    chihuahua: str = "America/Chihuahua"
    costa_rica: str = "America/Costa_Rica"
    creston: str = "America/Creston"
    cuiaba: str = "America/Cuiaba"
    curacao: str = "America/Curacao"
    danmarkshavn: str = "America/Danmarkshavn"
    dawson: str = "America/Dawson"
    dawson_creek: str = "America/Dawson_Creek"
    denver: str = "America/Denver"
    detroit: str = "America/Detroit"
    dominica: str = "America/Dominica"
    edmonton: str = "America/Edmonton"
    eirunepe: str = "America/Eirunepe"
    el_salvador: str = "America/El_Salvador"
    fort_nelson: str = "America/Fort_Nelson"
    fortaleza: str = "America/Fortaleza"
    glace_bay: str = "America/Glace_Bay"
    goose_bay: str = "America/Goose_Bay"
    grand_turk: str = "America/Grand_Turk"
    grenada: str = "America/Grenada"
    guadeloupe: str = "America/Guadeloupe"
    guatemala: str = "America/Guatemala"
    guayaquil: str = "America/Guayaquil"
    guyana: str = "America/Guyana"
    halifax: str = "America/Halifax"
    havana: str = "America/Havana"
    hermosillo: str = "America/Hermosillo"
    indianapolis: str = "America/Indiana/Indianapolis"
    knox: str = "America/Indiana/Knox"
    marengo: str = "America/Indiana/Marengo"
    petersburg: str = "America/Indiana/Petersburg"
    tell_city: str = "America/Indiana/Tell_City"
    vevay: str = "America/Indiana/Vevay"
    vincennes: str = "America/Indiana/Vincennes"
    winamac: str = "America/Indiana/Winamac"
    inuvik: str = "America/Inuvik"
    iqaluit: str = "America/Iqaluit"
    jamaica: str = "America/Jamaica"
    juneau: str = "America/Juneau"
    louisville: str = "America/Kentucky/Louisville"
    monticello: str = "America/Kentucky/Monticello"
    kralendijk: str = "America/Kralendijk"
    la_paz: str = "America/La_Paz"
    lima: str = "America/Lima"
    los_angeles: str = "America/Los_Angeles"
    lower_princes: str = "America/Lower_Princes"
    maceio: str = "America/Maceio"
    managua: str = "America/Managua"
    manaus: str = "America/Manaus"
    marigot: str = "America/Marigot"
    martinique: str = "America/Martinique"
    matamoros: str = "America/Matamoros"
    mazatlan: str = "America/Mazatlan"
    miquelon: str = "America/Miquelon"
    menominee: str = "America/Menominee"
    merida: str = "America/Merida"
    metlakatla: str = "America/Metlakatla"
    mexico_city: str = "America/Mexico_City"
    moncton: str = "America/Moncton"
    monterrey: str = "America/Monterrey"
    montevideo: str = "America/Montevideo"
    montserrat: str = "America/Montserrat"
    nassau: str = "America/Nassau"
    new_york: str = "America/New_York"
    nome: str = "America/Nome"
    noronha: str = "America/Noronha"
    beulah: str = "America/North_Dakota/Beulah"
    center: str = "America/North_Dakota/Center"
    new_salem: str = "America/North_Dakota/New_Salem"
    nuuk: str = "America/Nuuk"
    ojinaga: str = "America/Ojinaga"
    panama: str = "America/Panama"
    pangnirtung: str = "America/Pangnirtung"
    paramaribo: str = "America/Paramaribo"
    phoenix: str = "America/Phoenix"
    port_au_prince: str = "America/Port-au-Prince"
    port_of_spain: str = "America/Port_of_Spain"
    porto_velho: str = "America/Porto_Velho"
    puerto_rico: str = "America/Puerto_Rico"
    punta_arenas: str = "America/Punta_Arenas"
    rankin_inlet: str = "America/Rankin_Inlet"
    recife: str = "America/Recife"
    regina: str = "America/Regina"
    resolute: str = "America/Resolute"
    rio_branco: str = "America/Rio_Branco"
    santarem: str = "America/Santarem"
    santiago: str = "America/Santiago"
    santo_domingo: str = "America/Santo_Domingo"
    sao_paulo: str = "America/Sao_Paulo"
    scoresbysund: str = "America/Scoresbysund"
    sitka: str = "America/Sitka"
    st_barthelemy: str = "America/St_Barthelemy"
    st_johns: str = "America/St_Johns"
    st_kitts: str = "America/St_Kitts"
    st_lucia: str = "America/St_Lucia"
    st_thomas: str = "America/St_Thomas"
    st_vincent: str = "America/St_Vincent"
    swift_current: str = "America/Swift_Current"
    tegucigalpa: str = "America/Tegucigalpa"
    thule: str = "America/Thule"
    tijuana: str = "America/Tijuana"
    toronto: str = "America/Toronto"
    tortola: str = "America/Tortola"
    vancouver: str = "America/Vancouver"
    whitehorse: str = "America/Whitehorse"
    winnipeg: str = "America/Winnipeg"
    yakutat: str = "America/Yakutat"
    yellowknife: str = "America/Yellowknife"
    casey: str = "Antarctica/Casey"
    davis: str = "Antarctica/Davis"
    dumontdurville: str = "Antarctica/DumontDUrville"
    macquarie: str = "Antarctica/Macquarie"
    mawson: str = "Antarctica/Mawson"
    mcmurdo: str = "Antarctica/McMurdo"
    palmer: str = "Antarctica/Palmer"
    rothera: str = "Antarctica/Rothera"
    syowa: str = "Antarctica/Syowa"
    troll: str = "Antarctica/Troll"
    vostok: str = "Antarctica/Vostok"
    longyearbyen: str = "Arctic/Longyearbyen"
    aden: str = "Asia/Aden"
    almaty: str = "Asia/Almaty"
    amman: str = "Asia/Amman"
    anadyr: str = "Asia/Anadyr"
    aqtau: str = "Asia/Aqtau"
    aqtobe: str = "Asia/Aqtobe"
    ashgabat: str = "Asia/Ashgabat"
    atyrau: str = "Asia/Atyrau"
    baghdad: str = "Asia/Baghdad"
    bahrain: str = "Asia/Bahrain"
    baku: str = "Asia/Baku"
    bangkok: str = "Asia/Bangkok"
    barnaul: str = "Asia/Barnaul"
    beirut: str = "Asia/Beirut"
    bishkek: str = "Asia/Bishkek"
    brunei: str = "Asia/Brunei"
    chita: str = "Asia/Chita"
    choibalsan: str = "Asia/Choibalsan"
    colombo: str = "Asia/Colombo"
    damascus: str = "Asia/Damascus"
    dhaka: str = "Asia/Dhaka"
    dili: str = "Asia/Dili"
    dubai: str = "Asia/Dubai"
    dushanbe: str = "Asia/Dushanbe"
    famagusta: str = "Asia/Famagusta"
    gaza: str = "Asia/Gaza"
    hebron: str = "Asia/Hebron"
    ho_chi_minh: str = "Asia/Ho_Chi_Minh"
    hong_kong: str = "Asia/Hong_Kong"
    hovd: str = "Asia/Hovd"
    irkutsk: str = "Asia/Irkutsk"
    jakarta: str = "Asia/Jakarta"
    jayapura: str = "Asia/Jayapura"
    jerusalem: str = "Asia/Jerusalem"
    kabul: str = "Asia/Kabul"
    kamchatka: str = "Asia/Kamchatka"
    karachi: str = "Asia/Karachi"
    kathmandu: str = "Asia/Kathmandu"
    khandyga: str = "Asia/Khandyga"
    kolkata: str = "Asia/Kolkata"
    krasnoyarsk: str = "Asia/Krasnoyarsk"
    kuala_lumpur: str = "Asia/Kuala_Lumpur"
    kuching: str = "Asia/Kuching"
    kuwait: str = "Asia/Kuwait"
    macau: str = "Asia/Macau"
    magadan: str = "Asia/Magadan"
    makassar: str = "Asia/Makassar"
    manila: str = "Asia/Manila"
    muscat: str = "Asia/Muscat"
    nicosia: str = "Asia/Nicosia"
    novokuznetsk: str = "Asia/Novokuznetsk"
    novosibirsk: str = "Asia/Novosibirsk"
    omsk: str = "Asia/Omsk"
    oral: str = "Asia/Oral"
    phnom_penh: str = "Asia/Phnom_Penh"
    pontianak: str = "Asia/Pontianak"
    pyongyang: str = "Asia/Pyongyang"
    qatar: str = "Asia/Qatar"
    qostanay: str = "Asia/Qostanay"
    qyzylorda: str = "Asia/Qyzylorda"
    riyadh: str = "Asia/Riyadh"
    samarkand: str = "Asia/Samarkand"
    sakhalin: str = "Asia/Sakhalin"
    seoul: str = "Asia/Seoul"
    shanghai: str = "Asia/Shanghai"
    singapore: str = "Asia/Singapore"
    srednekolymsk: str = "Asia/Srednekolymsk"
    taipei: str = "Asia/Taipei"
    tashkent: str = "Asia/Tashkent"
    tbilisi: str = "Asia/Tbilisi"
    tehran: str = "Asia/Tehran"
    thimphu: str = "Asia/Thimphu"
    tokyo: str = "Asia/Tokyo"
    tomsk: str = "Asia/Tomsk"
    ulaanbaatar: str = "Asia/Ulaanbaatar"
    urumqi: str = "Asia/Urumqi"
    ust_nera: str = "Asia/Ust-Nera"
    vientiane: str = "Asia/Vientiane"
    vladivostok: str = "Asia/Vladivostok"
    yakutsk: str = "Asia/Yakutsk"
    yangon: str = "Asia/Yangon"
    yekaterinburg: str = "Asia/Yekaterinburg"
    yerevan: str = "Asia/Yerevan"
    azores: str = "Atlantic/Azores"
    bermuda: str = "Atlantic/Bermuda"
    canary: str = "Atlantic/Canary"
    cape_verde: str = "Atlantic/Cape_Verde"
    faroe: str = "Atlantic/Faroe"
    madeira: str = "Atlantic/Madeira"
    reykjavik: str = "Atlantic/Reykjavik"
    south_georgia: str = "Atlantic/South_Georgia"
    st_helena: str = "Atlantic/St_Helena"
    stanley: str = "Atlantic/Stanley"
    adelaide: str = "Australia/Adelaide"
    brisbane: str = "Australia/Brisbane"
    broken_hill: str = "Australia/Broken_Hill"
    darwin: str = "Australia/Darwin"
    eucla: str = "Australia/Eucla"
    hobart: str = "Australia/Hobart"
    lindeman: str = "Australia/Lindeman"
    lord_howe: str = "Australia/Lord_Howe"
    melbourne: str = "Australia/Melbourne"
    perth: str = "Australia/Perth"
    sydney: str = "Australia/Sydney"
    e_utc: str = "Etc/UTC"
    amsterdam: str = "Europe/Amsterdam"
    andorra: str = "Europe/Andorra"
    astrakhan: str = "Europe/Astrakhan"
    athens: str = "Europe/Athens"
    belgrade: str = "Europe/Belgrade"
    berlin: str = "Europe/Berlin"
    bratislava: str = "Europe/Bratislava"
    brussels: str = "Europe/Brussels"
    bucharest: str = "Europe/Bucharest"
    budapest: str = "Europe/Budapest"
    busingen: str = "Europe/Busingen"
    chisinau: str = "Europe/Chisinau"
    copenhagen: str = "Europe/Copenhagen"
    dublin: str = "Europe/Dublin"
    gibraltar: str = "Europe/Gibraltar"
    guernsey: str = "Europe/Guernsey"
    helsinki: str = "Europe/Helsinki"
    isle_of_man: str = "Europe/Isle_of_Man"
    istanbul: str = "Europe/Istanbul"
    jersey: str = "Europe/Jersey"
    kaliningrad: str = "Europe/Kaliningrad"
    kyiv: str = "Europe/Kyiv"
    kirov: str = "Europe/Kirov"
    lisbon: str = "Europe/Lisbon"
    ljubljana: str = "Europe/Ljubljana"
    london: str = "Europe/London"
    luxembourg: str = "Europe/Luxembourg"
    madrid: str = "Europe/Madrid"
    malta: str = "Europe/Malta"
    mariehamn: str = "Europe/Mariehamn"
    minsk: str = "Europe/Minsk"
    monaco: str = "Europe/Monaco"
    moscow: str = "Europe/Moscow"
    oslo: str = "Europe/Oslo"
    paris: str = "Europe/Paris"
    podgorica: str = "Europe/Podgorica"
    prague: str = "Europe/Prague"
    riga: str = "Europe/Riga"
    rome: str = "Europe/Rome"
    samara: str = "Europe/Samara"
    san_marino: str = "Europe/San_Marino"
    sarajevo: str = "Europe/Sarajevo"
    saratov: str = "Europe/Saratov"
    simferopol: str = "Europe/Simferopol"
    skopje: str = "Europe/Skopje"
    sofia: str = "Europe/Sofia"
    stockholm: str = "Europe/Stockholm"
    tallinn: str = "Europe/Tallinn"
    tirane: str = "Europe/Tirane"
    ulyanovsk: str = "Europe/Ulyanovsk"
    vaduz: str = "Europe/Vaduz"
    vatican: str = "Europe/Vatican"
    vienna: str = "Europe/Vienna"
    vilnius: str = "Europe/Vilnius"
    volgograd: str = "Europe/Volgograd"
    warsaw: str = "Europe/Warsaw"
    zagreb: str = "Europe/Zagreb"
    zurich: str = "Europe/Zurich"
    antananarivo: str = "Indian/Antananarivo"
    chagos: str = "Indian/Chagos"
    christmas: str = "Indian/Christmas"
    cocos: str = "Indian/Cocos"
    comoro: str = "Indian/Comoro"
    kerguelen: str = "Indian/Kerguelen"
    mahe: str = "Indian/Mahe"
    maldives: str = "Indian/Maldives"
    mauritius: str = "Indian/Mauritius"
    mayotte: str = "Indian/Mayotte"
    reunion: str = "Indian/Reunion"
    apia: str = "Pacific/Apia"
    auckland: str = "Pacific/Auckland"
    bougainville: str = "Pacific/Bougainville"
    chatham: str = "Pacific/Chatham"
    chuuk: str = "Pacific/Chuuk"
    easter: str = "Pacific/Easter"
    efate: str = "Pacific/Efate"
    fakaofo: str = "Pacific/Fakaofo"
    fiji: str = "Pacific/Fiji"
    funafuti: str = "Pacific/Funafuti"
    galapagos: str = "Pacific/Galapagos"
    gambier: str = "Pacific/Gambier"
    guadalcanal: str = "Pacific/Guadalcanal"
    guam: str = "Pacific/Guam"
    honolulu: str = "Pacific/Honolulu"
    kanton: str = "Pacific/Kanton"
    kiritimati: str = "Pacific/Kiritimati"
    kosrae: str = "Pacific/Kosrae"
    kwajalein: str = "Pacific/Kwajalein"
    majuro: str = "Pacific/Majuro"
    marquesas: str = "Pacific/Marquesas"
    midway: str = "Pacific/Midway"
    nauru: str = "Pacific/Nauru"
    niue: str = "Pacific/Niue"
    norfolk: str = "Pacific/Norfolk"
    noumea: str = "Pacific/Noumea"
    pago_pago: str = "Pacific/Pago_Pago"
    palau: str = "Pacific/Palau"
    pitcairn: str = "Pacific/Pitcairn"
    pohnpei: str = "Pacific/Pohnpei"
    port_moresby: str = "Pacific/Port_Moresby"
    rarotonga: str = "Pacific/Rarotonga"
    saipan: str = "Pacific/Saipan"
    tahiti: str = "Pacific/Tahiti"
    tarawa: str = "Pacific/Tarawa"
    tongatapu: str = "Pacific/Tongatapu"
    wake: str = "Pacific/Wake"
    wallis: str = "Pacific/Wallis"
    gmt_m_12: str = "Etc/GMT-12"
    gmt_m_11: str = "Etc/GMT-11"
    gmt_m_10: str = "Etc/GMT-10"
    gmt_m_9: str = "Etc/GMT-9"
    gmt_m_8: str = "Etc/GMT-8"
    gmt_m_7: str = "Etc/GMT-7"
    gmt_m_6: str = "Etc/GMT-6"
    gmt_m_5: str = "Etc/GMT-5"
    gmt_m_4: str = "Etc/GMT-4"
    gmt_m_3: str = "Etc/GMT-3"
    gmt_m_2: str = "Etc/GMT-2"
    gmt_m_1: str = "Etc/GMT-1"
    gmt: str = "Etc/GMT"
    gmt_p_1: str = "Etc/GMT+1"
    gmt_p_2: str = "Etc/GMT+2"
    gmt_p_3: str = "Etc/GMT+3"
    gmt_p_4: str = "Etc/GMT+4"
    gmt_p_5: str = "Etc/GMT+5"
    gmt_p_6: str = "Etc/GMT+6"
    gmt_p_7: str = "Etc/GMT+7"
    gmt_p_8: str = "Etc/GMT+8"
    gmt_p_9: str = "Etc/GMT+9"
    gmt_p_10: str = "Etc/GMT+10"
    gmt_p_11: str = "Etc/GMT+11"
    gmt_p_12: str = "Etc/GMT+12"

    # aliases we allow
    alaska: str = "US/Alaska"
    aleutian: str = "US/Aleutian"
    arizona: str = "US/Arizona"
    central: str = "US/Central"
    east_indiana: str = "US/East-Indiana"
    eastern: str = "US/Eastern"
    hawaii: str = "US/Hawaii"
    indiana_starke: str = "US/Indiana-Starke"
    michigan: str = "US/Michigan"
    mountain: str = "US/Mountain"
    pacific: str = "US/Pacific"
    samoa: str = "US/Samoa"


def timezone_to_canonical_name(timezone: TimezoneEnum):
    if timezone == TimezoneEnum.alaska:
        return TimezoneEnum.anchorage
    if timezone == TimezoneEnum.aleutian:
        return TimezoneEnum.adak
    if timezone == TimezoneEnum.arizona:
        return TimezoneEnum.phoenix
    if timezone == TimezoneEnum.central:
        return TimezoneEnum.chicago
    if timezone == TimezoneEnum.east_indiana:
        return TimezoneEnum.indianapolis
    if timezone == TimezoneEnum.eastern:
        return TimezoneEnum.new_york
    if timezone == TimezoneEnum.hawaii:
        return TimezoneEnum.honolulu
    if timezone == TimezoneEnum.indiana_starke:
        return TimezoneEnum.knox
    if timezone == TimezoneEnum.michigan:
        return TimezoneEnum.detroit
    if timezone == TimezoneEnum.mountain:
        return TimezoneEnum.denver
    if timezone == TimezoneEnum.pacific:
        return TimezoneEnum.los_angeles
    if timezone == TimezoneEnum.samoa:
        return TimezoneEnum.pago
    return timezone

class PriceType(str, Enum):
    rack = "rack"
    contract = "contract"
    index = "index"
    inventory = "inventory"
    spot = "spot"

    @classmethod
    def list_of_values(cls):
        return [v.value for v in cls.__members__.values()]

    @classmethod
    def string_of_values(cls):
        return ",".join([v.value for v in cls.__members__.values()])

    def __str__(self):
        return self.value