module Fake.Provider.Locale
  ( fakeLocale
  , localeMap
  ) where

------------------------------------------------------------------------------
import qualified Data.Map as M
import           Data.Monoid
------------------------------------------------------------------------------
import           Fake.Combinators
import           Fake.Types
------------------------------------------------------------------------------

------------------------------------------------------------------------------
-- | Generates fake locales.  "en_US", "de_CH", etc...
fakeLocale :: FGen String
fakeLocale = elements $ concat $ makeList <$> M.toList localeMap

makeList :: (String, [String]) -> [String]
makeList (k,vs) = map (\v -> k <> "_" <> v) vs

------------------------------------------------------------------------------
-- | A map of all the locales
localeMap :: M.Map String [String]
localeMap = M.fromList
    [ ("aa", ["DJ", "ER", "ET"])
    , ("af", ["ZA"])
    , ("ak", ["GH"])
    , ("am", ["ET"])
    , ("an", ["ES"])
    , ("apn", ["IN"])
    , ("ar", ["AE", "BH", "DJ", "DZ", "EG", "EH", "ER", "IL", "IN"
             ,"IQ", "JO", "KM", "KW", "LB", "LY", "MA", "MR", "OM"
             ,"PS", "QA", "SA", "SD", "SO", "SS", "SY", "TD", "TN", "YE"])
    , ("as", ["IN"])
    , ("ast", ["ES"])
    , ("ayc", ["PE"])
    , ("az", ["AZ", "IN"])
    , ("be", ["BY"])
    , ("bem", ["ZM"])
    , ("ber", ["DZ", "MA"])
    , ("bg", ["BG"])
    , ("bhb", ["IN"])
    , ("bho", ["IN"])
    , ("bn", ["BD", "IN"])
    , ("bo", ["CN", "IN"])
    , ("br", ["FR"])
    , ("brx", ["IN"])
    , ("bs", ["BA"])
    , ("byn", ["ER"])
    , ("ca", ["AD", "ES", "FR", "IT"])
    , ("ce", ["RU"])
    , ("ckb", ["IQ"])
    , ("cmn", ["TW"])
    , ("crh", ["UA"])
    , ("cs", ["CZ"])
    , ("csb", ["PL"])
    , ("cv", ["RU"])
    , ("cy", ["GB"])
    , ("da", ["DK"])
    , ("de", ["AT", "BE", "CH", "DE", "LI", "LU"])
    , ("doi", ["IN"])
    , ("dv", ["MV"])
    , ("dz", ["BT"])
    , ("el", ["GR", "CY"])
    , ("en", ["AG", "AU", "BW", "CA", "DK", "GB", "HK", "IE", "IN", "NG"
             ,"NZ", "PH", "SG", "US", "ZA", "ZM", "ZW"])
    , ("eo", ["US"])
    , ("es", ["AR", "BO", "CL", "CO", "CR", "CU", "DO", "EC", "ES", "GT"
             ,"HN", "MX", "NI", "PA", "PE", "PR", "PY", "SV", "US", "UY", "VE"])
    , ("et", ["EE"])
    , ("eu", ["ES", "FR"])
    , ("fa", ["IR"])
    , ("ff", ["SN"])
    , ("fi", ["FI"])
    , ("fil", ["PH"])
    , ("fo", ["FO"])
    , ("fr", ["CA", "CH", "FR", "LU"])
    , ("fur", ["IT"])
    , ("fy", ["NL", "DE"])
    , ("ga", ["IE"])
    , ("gd", ["GB"])
    , ("gez", ["ER", "ET"])
    , ("gl", ["ES"])
    , ("gu", ["IN"])
    , ("gv", ["GB"])
    , ("ha", ["NG"])
    , ("hak", ["TW"])
    , ("he", ["IL"])
    , ("hi", ["IN"])
    , ("hne", ["IN"])
    , ("hr", ["HR"])
    , ("hsb", ["DE"])
    , ("ht", ["HT"])
    , ("hu", ["HU"])
    , ("hy", ["AM"])
    , ("ia", ["FR"])
    , ("id", ["ID"])
    , ("ig", ["NG"])
    , ("ik", ["CA"])
    , ("is", ["IS"])
    , ("it", ["CH", "IT"])
    , ("iu", ["CA"])
    , ("iw", ["IL"])
    , ("ja", ["JP"])
    , ("ka", ["GE"])
    , ("kk", ["KZ"])
    , ("kl", ["GL"])
    , ("km", ["KH"])
    , ("kn", ["IN"])
    , ("ko", ["KR"])
    , ("kok", ["IN"])
    , ("ks", ["IN"])
    , ("ku", ["TR"])
    , ("kw", ["GB"])
    , ("ky", ["KG"])
    , ("lb", ["LU"])
    , ("lg", ["UG"])
    , ("li", ["BE", "NL"])
    , ("lij", ["IT"])
    , ("ln", ["CD"])
    , ("lo", ["LA"])
    , ("lt", ["LT"])
    , ("lv", ["LV"])
    , ("lzh", ["TW"])
    , ("mag", ["IN"])
    , ("mai", ["IN"])
    , ("mg", ["MG"])
    , ("mhr", ["RU"])
    , ("mi", ["NZ"])
    , ("mk", ["MK"])
    , ("ml", ["IN"])
    , ("mn", ["MN"])
    , ("mni", ["IN"])
    , ("mr", ["IN"])
    , ("ms", ["MY"])
    , ("mt", ["MT"])
    , ("my", ["MM"])
    , ("nan", ["TW"])
    , ("nb", ["NO"])
    , ("nds", ["DE", "NL"])
    , ("ne", ["NP"])
    , ("nhn", ["MX"])
    , ("niu", ["NU", "NZ"])
    , ("nl", ["AW", "BE", "NL"])
    , ("nn", ["NO"])
    , ("nr", ["ZA"])
    , ("nso", ["ZA"])
    , ("oc", ["FR"])
    , ("om", ["ET", "KE"])
    , ("or", ["IN"])
    , ("os", ["RU"])
    , ("pa", ["IN", "PK"])
    , ("pap", ["AN", "AW", "CW"])
    , ("pl", ["PL"])
    , ("ps", ["AF"])
    , ("pt", ["BR", "PT"])
    , ("quz", ["PE"])
    , ("raj", ["IN"])
    , ("ro", ["RO"])
    , ("ru", ["RU", "UA"])
    , ("rw", ["RW"])
    , ("sa", ["IN"])
    , ("sat", ["IN"])
    , ("sc", ["IT"])
    , ("sd", ["IN", "PK"])
    , ("se", ["NO"])
    , ("shs", ["CA"])
    , ("si", ["LK"])
    , ("sid", ["ET"])
    , ("sk", ["SK"])
    , ("sl", ["SI"])
    , ("so", ["DJ", "ET", "KE", "SO"])
    , ("sq", ["AL", "ML"])
    , ("sr", ["ME", "RS"])
    , ("ss", ["ZA"])
    , ("st", ["ZA"])
    , ("sv", ["FI", "SE"])
    , ("sw", ["KE", "TZ"])
    , ("szl", ["PL"])
    , ("ta", ["IN", "LK"])
    , ("tcy", ["IN"])
    , ("te", ["IN"])
    , ("tg", ["TJ"])
    , ("th", ["TH"])
    , ("the", ["NP"])
    , ("ti", ["ER", "ET"])
    , ("tig", ["ER"])
    , ("tk", ["TM"])
    , ("tl", ["PH"])
    , ("tn", ["ZA"])
    , ("tr", ["CY", "TR"])
    , ("ts", ["ZA"])
    , ("tt", ["RU"])
    , ("ug", ["CN"])
    , ("uk", ["UA"])
    , ("unm", ["US"])
    , ("ur", ["IN", "PK"])
    , ("uz", ["UZ"])
    , ("ve", ["ZA"])
    , ("vi", ["VN"])
    , ("wa", ["BE"])
    , ("wae", ["CH"])
    , ("wal", ["ET"])
    , ("wo", ["SN"])
    , ("xh", ["ZA"])
    , ("yi", ["US"])
    , ("yo", ["NG"])
    , ("yue", ["HK"])
    , ("zh", ["CN", "HK", "SG", "TW"])
    , ("zu", ["ZA"])
    ]