package com.applemand.zmanim.core.location

/**
 * ISO-3166-1 alpha-2 country codes with English common names + common aliases.
 *
 * The cities DB stores `country` as the 2-letter ISO code. This table lets the
 * location search accept free-form country names ("Israel", "United States",
 * "UK", "England") and expand them into the stored code so FTS matches.
 *
 * Source: ISO-3166 common names, with pragmatic aliases for everyday usage.
 */
object CountryNames {

    /** Lowercase alias → ISO code. Multiple aliases per country are allowed. */
    private val aliasToCode: Map<String, String> = buildMap {
        fun add(code: String, vararg names: String) {
            names.forEach { put(it.lowercase(), code) }
        }

        add("US", "united states", "usa", "us", "america", "united states of america")
        add("CA", "canada")
        add("IL", "israel", "eretz yisroel", "eretz yisrael", "medinat yisrael")
        add("GB", "united kingdom", "uk", "britain", "great britain", "england")
        add("FR", "france")
        add("DE", "germany", "deutschland")
        add("AU", "australia")
        add("RU", "russia", "russian federation")
        add("CN", "china")
        add("JP", "japan")
        add("MX", "mexico")
        add("BR", "brazil")
        add("AR", "argentina")
        add("ZA", "south africa")
        add("IN", "india")
        add("IT", "italy", "italia")
        add("ES", "spain", "espana", "españa")
        add("PT", "portugal")
        add("BE", "belgium")
        add("NL", "netherlands", "holland")
        add("CH", "switzerland", "suisse", "schweiz")
        add("AT", "austria", "osterreich")
        add("SE", "sweden", "sverige")
        add("NO", "norway", "norge")
        add("DK", "denmark", "danmark")
        add("FI", "finland", "suomi")
        add("IE", "ireland", "eire")
        add("PL", "poland", "polska")
        add("UA", "ukraine")
        add("HU", "hungary", "magyarorszag")
        add("CZ", "czech republic", "czechia")
        add("SK", "slovakia")
        add("GR", "greece", "hellas")
        add("RO", "romania")
        add("BG", "bulgaria")
        add("TR", "turkey", "turkiye")
        add("CY", "cyprus")
        add("MA", "morocco")
        add("EG", "egypt")
        add("TN", "tunisia")
        add("DZ", "algeria")
        add("ET", "ethiopia")
        add("NG", "nigeria")
        add("KE", "kenya")
        add("NZ", "new zealand")
        add("KR", "south korea", "korea")
        add("TH", "thailand")
        add("VN", "vietnam")
        add("SG", "singapore")
        add("PH", "philippines")
        add("ID", "indonesia")
        add("MY", "malaysia")
        add("HK", "hong kong")
        add("TW", "taiwan")
        add("CL", "chile")
        add("CO", "colombia")
        add("PE", "peru")
        add("VE", "venezuela")
        add("UY", "uruguay")
        add("PA", "panama")
        add("CR", "costa rica")
        add("CU", "cuba")
        add("DO", "dominican republic")
        add("JM", "jamaica")
        add("HT", "haiti")
        add("IR", "iran")
        add("IQ", "iraq")
        add("SY", "syria")
        add("LB", "lebanon")
        add("JO", "jordan")
        add("SA", "saudi arabia")
        add("AE", "united arab emirates", "uae")
        add("KW", "kuwait")
        add("BH", "bahrain")
        add("QA", "qatar")
        add("OM", "oman")
        add("YE", "yemen")
        add("AF", "afghanistan")
        add("PK", "pakistan")
        add("BD", "bangladesh")
        add("LK", "sri lanka")
        add("NP", "nepal")
    }

    /**
     * Returns the ISO-2 code for a free-form country string, or null when no match.
     * Matches are exact (case-insensitive, trim).
     */
    fun codeFor(name: String): String? {
        val key = name.trim().lowercase()
        if (key.length == 2) return key.uppercase()  // already a code
        return aliasToCode[key]
    }
}
