pub const NEVER_CAPITALIZE: [&str; 46] = [
    "a",
    "above",
    "across",
    "against",
    "among",
    "an",
    "and",
    "around",
    "as",
    "at",
    "behind",
    "below",
    "beneath",
    "beside",
    "between",
    "but",
    "by",
    "during",
    "for",
    "from",
    "front",
    "in",
    "inside",
    "into",
    "m",
    "n",
    "near",
    "nor",
    "of",
    "on",
    "onto",
    "or",
    "over",
    "s",
    "since",
    "so",
    "t",
    "the",
    "to",
    "toward",
    "under",
    "underneath",
    "until",
    "with",
    "within",
    "yet",
];

pub const ALWAYS_CAPITALIZE: [&str; 426] = [
    "ababa",
    "abidjan",
    "addis",
    "afghanistan",
    "africa",
    "african",
    "ahmedabad",
    "aires",
    "albania",
    "alexandria",
    "algeria",
    "algiers",
    "america",
    "american",
    "amsterdam",
    "andorra",
    "angeles",
    "angola",
    "antigua",
    "april",
    "arab",
    "arabia",
    "argentina",
    "armenia",
    "asia",
    "asian",
    "athens",
    "atlanta",
    "august",
    "australia",
    "australian",
    "austria",
    "azerbaijan",
    "baghdad",
    "bahamas",
    "bahrain",
    "bangalore",
    "bangkok",
    "bangladesh",
    "bangladeshi",
    "barbados",
    "barbuda",
    "barcelona",
    "beijing",
    "belarus",
    "belgium",
    "belize",
    "belo",
    "benin",
    "berlin",
    "bernardino",
    "bhutan",
    "birmingham",
    "bissau",
    "bogotá",
    "bolivia",
    "bonn",
    "bosnia",
    "boston",
    "botswana",
    "brasília",
    "brazil",
    "brazilian",
    "british",
    "brunei",
    "brussels",
    "bucharest",
    "budapest",
    "buenos",
    "bulgaria",
    "burkina faso",
    "burma",
    "burundi",
    "cabo verde",
    "cairo",
    "cambodia",
    "cameroon",
    "canada",
    "casablanca",
    "chad",
    "chengdu",
    "chennai",
    "chi",
    "chicago",
    "chile",
    "china",
    "chinese",
    "chongqing",
    "cologne",
    "colombia",
    "comoros",
    "congo",
    "congo-brazzaville",
    "congolese",
    "copenhagen",
    "costa rica",
    "croatia",
    "cuba",
    "cyprus",
    "czech",
    "czechia",
    "côte",
    "d'ivoire",
    "dakar",
    "dalian",
    "dallas",
    "dar",
    "december",
    "delhi",
    "denmark",
    "detroit",
    "dhaka",
    "djibouti",
    "dominica",
    "dominican",
    "dongguan",
    "douala",
    "dr",
    "dublin",
    "durban",
    "ecuador",
    "egypt",
    "egyptian",
    "el",
    "emirates",
    "england",
    "english",
    "equatorial",
    "eritrea",
    "estonia",
    "eswatini",
    "ethiopia",
    "ethiopian",
    "europe",
    "european",
    "february",
    "fiji",
    "filipino",
    "finland",
    "fortaleza",
    "foshan",
    "france",
    "francisco",
    "frankfurt",
    "french",
    "friday",
    "fukuoka",
    "gabon",
    "gambia",
    "georgia",
    "german",
    "germany",
    "ghana",
    "greece",
    "grenada",
    "grenadines",
    "guadalajara",
    "guangzhou",
    "guatemala",
    "guinea",
    "guinea",
    "guinea-bissau",
    "guyana",
    "hague",
    "haiti",
    "hamburg",
    "hangzhou",
    "hanoi",
    "harbin",
    "herzegovina",
    "ho",
    "holy",
    "honduras",
    "hong",
    "horizonte",
    "houston",
    "hungary",
    "hyderabad",
    "i",
    "ibadan",
    "iceland",
    "india",
    "indian",
    "indonesia",
    "indonesian",
    "iran",
    "iranian",
    "iraq",
    "ireland",
    "irish",
    "islands",
    "israel",
    "istanbul",
    "italian",
    "italy",
    "jakarta",
    "jamaica",
    "janeiro",
    "january",
    "japan",
    "japanese",
    "jinan",
    "jinjiang",
    "johannesburg",
    "jordan",
    "july",
    "june",
    "kano",
    "karachi",
    "kazakhstan",
    "kenya",
    "khartoum",
    "kiev",
    "kingdom",
    "kinshasa",
    "kiribati",
    "kitts",
    "kobe",
    "kolkata",
    "kong",
    "korea",
    "kuala",
    "kuwait",
    "kyoto",
    "kyrgyzstan",
    "lagos",
    "lahore",
    "lanka",
    "laos",
    "latvia",
    "lebanon",
    "leone",
    "lesotho",
    "liberia",
    "libya",
    "liechtenstein",
    "lima",
    "lisbon",
    "lithuania",
    "london",
    "los",
    "luanda",
    "lucia",
    "lumpur",
    "luxembourg",
    "lyon",
    "macedonia",
    "madagascar",
    "madrid",
    "malawi",
    "malaysia",
    "maldives",
    "mali",
    "malta",
    "manchester",
    "manila",
    "march",
    "marino",
    "marseille",
    "mauritania",
    "mauritius",
    "may",
    "medellín",
    "mexico",
    "mexican",
    "miami",
    "micronesia",
    "milan",
    "minh",
    "mogadishu",
    "moldova",
    "monaco",
    "monday",
    "mongolia",
    "montenegro",
    "monterrey",
    "montreal",
    "morocco",
    "moscow",
    "mozambique",
    "mr",
    "mrs",
    "mumbai",
    "munich",
    "myanmar",
    "nagoya",
    "nairobi",
    "namibia",
    "nanjing",
    "naples",
    "nauru",
    "nepal",
    "netherlands",
    "nevis",
    "nicaragua",
    "niger",
    "nigeria",
    "nigerian",
    "norway",
    "november",
    "oakland",
    "october",
    "oman",
    "osaka",
    "ouagadougou",
    "pakistan",
    "pakistani",
    "palau",
    "palestine",
    "panama",
    "papua",
    "paraguay",
    "paris",
    "paulo",
    "peru",
    "petersburg",
    "philadelphia",
    "philippines",
    "phoenix",
    "poland",
    "porto alegre",
    "portugal",
    "prague",
    "pune",
    "qatar",
    "qingdao",
    "quanzhou",
    "recife",
    "republic",
    "rio",
    "riverside",
    "riyadh",
    "romania",
    "rome",
    "rotterdam",
    "ruhr",
    "russia",
    "russian",
    "rwanda",
    "saint",
    "salaam",
    "salvador",
    "samoa",
    "san",
    "santiago",
    "sao",
    "saturday",
    "saudi",
    "seattle",
    "senegal",
    "seoul",
    "september",
    "serbia",
    "seychelles",
    "shanghai",
    "shenyang",
    "shenzhen",
    "shishi",
    "sierra",
    "singapore",
    "slovakia",
    "slovenia",
    "sofia",
    "solomon",
    "somalia",
    "spain",
    "sri",
    "states",
    "stockholm",
    "sudan",
    "sunday",
    "surat",
    "suriname",
    "suzhou",
    "swaziland",
    "sweden",
    "switzerland",
    "syria",
    "são",
    "tajikistan",
    "tanzania",
    "tanzanian",
    "tehran",
    "thai",
    "thailand",
    "thursday",
    "tianjin",
    "timor-leste",
    "tobago",
    "togo",
    "tokyo",
    "tome",
    "tonga",
    "toronto",
    "trinidad",
    "tuesday",
    "tunisia",
    "turin",
    "turkey",
    "turkish",
    "turkmenistan",
    "tuvalu",
    "uganda",
    "uk",
    "ukraine",
    "united",
    "uruguay",
    "us",
    "usa",
    "uzbekistan",
    "vanuatu",
    "venezuela",
    "vienna",
    "vietnam",
    "vietnamese",
    "vincent",
    "warsaw",
    "washington",
    "wednesday",
    "wuhan",
    "xi'an",
    "yangon",
    "yemen",
    "york",
    "zambia",
    "zimbabwe",
];

/// Will get an english name for a zero-indexed month.
/// Returns an error if month out of range.
pub fn get_month_name(month: u8) -> Result<String, ()> {
    Ok(match month {
        0 => "January",
        1 => "February",
        2 => "March",
        3 => "April",
        4 => "May",
        5 => "June",
        6 => "July",
        7 => "August",
        8 => "September",
        9 => "October",
        10 => "November",
        11 => "December",
        _ => return Err(()),
    }
    .to_string())
}

/// Will get an english three-letter abbreviation for a zero-indexed month.
/// Returns an error if month out of range.
pub fn get_month_abbr(month: u8, dot: bool) -> Result<String, ()> {
    let mut res = match month {
        0 => "Jan",
        1 => "Feb",
        2 => "Mar",
        3 => "Apr",
        4 => "May",
        5 => "Jun",
        6 => "Jul",
        7 => "Aug",
        8 => "Sep",
        9 => "Oct",
        10 => "Nov",
        11 => "Dec",
        _ => return Err(()),
    }
    .to_string();

    if dot && month != 4 {
        res.push('.');
    }

    Ok(res)
}

pub fn get_ordinal(num: i64) -> String {
    let my = num.abs();
    let suffix = match my {
        1 => "st",
        2 => "nd",
        3 => "rd",
        _ => "th",
    };

    num.to_string() + suffix
}
