package cloudflare

import "sort"

// Country represents a country for the geo selector UI.
type Country struct {
	Code string `json:"code"` // ISO 3166-1 alpha-2
	Name string `json:"name"` // Hungarian name
}

// countries maps ISO 3166-1 alpha-2 codes to Hungarian country names.
var countries = map[string]string{
	"AF": "Afganisztán",
	"AL": "Albánia",
	"DZ": "Algéria",
	"AS": "Amerikai Szamoa",
	"AD": "Andorra",
	"AO": "Angola",
	"AI": "Anguilla",
	"AQ": "Antarktisz",
	"AG": "Antigua és Barbuda",
	"AR": "Argentína",
	"AM": "Örményország",
	"AW": "Aruba",
	"AU": "Ausztrália",
	"AT": "Ausztria",
	"AZ": "Azerbajdzsán",
	"BS": "Bahama-szigetek",
	"BH": "Bahrein",
	"BD": "Banglades",
	"BB": "Barbados",
	"BY": "Fehéroroszország",
	"BE": "Belgium",
	"BZ": "Belize",
	"BJ": "Benin",
	"BM": "Bermuda",
	"BT": "Bhután",
	"BO": "Bolívia",
	"BA": "Bosznia-Hercegovina",
	"BW": "Botswana",
	"BR": "Brazília",
	"BN": "Brunei",
	"BG": "Bulgária",
	"BF": "Burkina Faso",
	"BI": "Burundi",
	"CV": "Cabo Verde",
	"KH": "Kambodzsa",
	"CM": "Kamerun",
	"CA": "Kanada",
	"KY": "Kajmán-szigetek",
	"CF": "Közép-afrikai Köztársaság",
	"TD": "Csád",
	"CL": "Chile",
	"CN": "Kína",
	"CO": "Kolumbia",
	"KM": "Comore-szigetek",
	"CG": "Kongó",
	"CD": "Kongói Demokratikus Köztársaság",
	"CK": "Cook-szigetek",
	"CR": "Costa Rica",
	"CI": "Elefántcsontpart",
	"HR": "Horvátország",
	"CU": "Kuba",
	"CW": "Curaçao",
	"CY": "Ciprus",
	"CZ": "Csehország",
	"DK": "Dánia",
	"DJ": "Dzsibuti",
	"DM": "Dominika",
	"DO": "Dominikai Köztársaság",
	"EC": "Ecuador",
	"EG": "Egyiptom",
	"SV": "Salvador",
	"GQ": "Egyenlítői-Guinea",
	"ER": "Eritrea",
	"EE": "Észtország",
	"SZ": "Eswatini",
	"ET": "Etiópia",
	"FK": "Falkland-szigetek",
	"FO": "Feröer-szigetek",
	"FJ": "Fidzsi-szigetek",
	"FI": "Finnország",
	"FR": "Franciaország",
	"GF": "Francia Guyana",
	"PF": "Francia Polinézia",
	"GA": "Gabon",
	"GM": "Gambia",
	"GE": "Grúzia",
	"DE": "Németország",
	"GH": "Ghána",
	"GI": "Gibraltár",
	"GR": "Görögország",
	"GL": "Grönland",
	"GD": "Grenada",
	"GP": "Guadeloupe",
	"GU": "Guam",
	"GT": "Guatemala",
	"GG": "Guernsey",
	"GN": "Guinea",
	"GW": "Bissau-Guinea",
	"GY": "Guyana",
	"HT": "Haiti",
	"HN": "Honduras",
	"HK": "Hongkong",
	"HU": "Magyarország",
	"IS": "Izland",
	"IN": "India",
	"ID": "Indonézia",
	"IR": "Irán",
	"IQ": "Irak",
	"IE": "Írország",
	"IM": "Man-sziget",
	"IL": "Izrael",
	"IT": "Olaszország",
	"JM": "Jamaica",
	"JP": "Japán",
	"JE": "Jersey",
	"JO": "Jordánia",
	"KZ": "Kazahsztán",
	"KE": "Kenya",
	"KI": "Kiribati",
	"KP": "Észak-Korea",
	"KR": "Dél-Korea",
	"KW": "Kuvait",
	"KG": "Kirgizisztán",
	"LA": "Laosz",
	"LV": "Lettország",
	"LB": "Libanon",
	"LS": "Lesotho",
	"LR": "Libéria",
	"LY": "Líbia",
	"LI": "Liechtenstein",
	"LT": "Litvánia",
	"LU": "Luxemburg",
	"MO": "Makaó",
	"MG": "Madagaszkár",
	"MW": "Malawi",
	"MY": "Malajzia",
	"MV": "Maldív-szigetek",
	"ML": "Mali",
	"MT": "Málta",
	"MH": "Marshall-szigetek",
	"MQ": "Martinique",
	"MR": "Mauritánia",
	"MU": "Mauritius",
	"YT": "Mayotte",
	"MX": "Mexikó",
	"FM": "Mikronézia",
	"MD": "Moldova",
	"MC": "Monaco",
	"MN": "Mongólia",
	"ME": "Montenegró",
	"MS": "Montserrat",
	"MA": "Marokkó",
	"MZ": "Mozambik",
	"MM": "Mianmar",
	"NA": "Namíbia",
	"NR": "Nauru",
	"NP": "Nepál",
	"NL": "Hollandia",
	"NC": "Új-Kaledónia",
	"NZ": "Új-Zéland",
	"NI": "Nicaragua",
	"NE": "Niger",
	"NG": "Nigéria",
	"NU": "Niue",
	"NF": "Norfolk-sziget",
	"MK": "Észak-Macedónia",
	"MP": "Északi-Mariana-szigetek",
	"NO": "Norvégia",
	"OM": "Omán",
	"PK": "Pakisztán",
	"PW": "Palau",
	"PS": "Palesztina",
	"PA": "Panama",
	"PG": "Pápua Új-Guinea",
	"PY": "Paraguay",
	"PE": "Peru",
	"PH": "Fülöp-szigetek",
	"PL": "Lengyelország",
	"PT": "Portugália",
	"PR": "Puerto Rico",
	"QA": "Katar",
	"RE": "Réunion",
	"RO": "Románia",
	"RU": "Oroszország",
	"RW": "Ruanda",
	"BL": "Saint-Barthélemy",
	"SH": "Szent Ilona",
	"KN": "Saint Kitts és Nevis",
	"LC": "Saint Lucia",
	"MF": "Saint-Martin",
	"PM": "Saint-Pierre és Miquelon",
	"VC": "Saint Vincent és a Grenadine-szigetek",
	"WS": "Szamoa",
	"SM": "San Marino",
	"ST": "São Tomé és Príncipe",
	"SA": "Szaúd-Arábia",
	"SN": "Szenegál",
	"RS": "Szerbia",
	"SC": "Seychelle-szigetek",
	"SL": "Sierra Leone",
	"SG": "Szingapúr",
	"SX": "Sint Maarten",
	"SK": "Szlovákia",
	"SI": "Szlovénia",
	"SB": "Salamon-szigetek",
	"SO": "Szomália",
	"ZA": "Dél-afrikai Köztársaság",
	"SS": "Dél-Szudán",
	"ES": "Spanyolország",
	"LK": "Srí Lanka",
	"SD": "Szudán",
	"SR": "Suriname",
	"SE": "Svédország",
	"CH": "Svájc",
	"SY": "Szíria",
	"TW": "Tajvan",
	"TJ": "Tádzsikisztán",
	"TZ": "Tanzánia",
	"TH": "Thaiföld",
	"TL": "Kelet-Timor",
	"TG": "Togo",
	"TK": "Tokelau",
	"TO": "Tonga",
	"TT": "Trinidad és Tobago",
	"TN": "Tunézia",
	"TR": "Törökország",
	"TM": "Türkmenisztán",
	"TC": "Turks- és Caicos-szigetek",
	"TV": "Tuvalu",
	"UG": "Uganda",
	"UA": "Ukrajna",
	"AE": "Egyesült Arab Emírségek",
	"GB": "Egyesült Királyság",
	"US": "Egyesült Államok",
	"UY": "Uruguay",
	"UZ": "Üzbegisztán",
	"VU": "Vanuatu",
	"VA": "Vatikán",
	"VE": "Venezuela",
	"VN": "Vietnám",
	"VG": "Brit Virgin-szigetek",
	"VI": "Amerikai Virgin-szigetek",
	"WF": "Wallis és Futuna",
	"EH": "Nyugat-Szahara",
	"YE": "Jemen",
	"ZM": "Zambia",
	"ZW": "Zimbabwe",
}

// AllCountries returns all countries sorted by Hungarian name.
func AllCountries() []Country {
	result := make([]Country, 0, len(countries))
	for code, name := range countries {
		result = append(result, Country{Code: code, Name: name})
	}
	sort.Slice(result, func(i, j int) bool {
		return result[i].Name < result[j].Name
	})
	return result
}

// CountryName returns the Hungarian name for a country code, or the code itself if unknown.
func CountryName(code string) string {
	if name, ok := countries[code]; ok {
		return name
	}
	return code
}

// ValidCountryCode returns true if code is a valid ISO 3166-1 alpha-2 code.
func ValidCountryCode(code string) bool {
	_, ok := countries[code]
	return ok
}
