/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

namespace Lucene.Net.Support
{
    public static class CultureInfoSupport
    {
#if NETSTANDARD

        #region culturePool
        private static string[] specificCulturePool = new string[] 
        {
            "fr-KM",
            "fr-LU",
            "fr-MA",
            "fr-MC",
            "fr-MF",
            "fr-MG",
            "fr-ML",
            "fr-MQ",
            "fr-MR",
            "fr-MU",
            "fr-NC",
            "fr-NE",
            "fr-PF",
            "fr-PM",
            "fr-RE",
            "fr-RW",
            "fr-SC",
            "fr-SN",
            "fr-SY",
            "fr-TD",
            "fr-TG",
            "fr-TN",
            "fr-VU",
            "fr-WF",
            "fr-YT",
            "fur-IT",
            "fy-NL",
            "ga-IE",
            "gd-GB",
            "gl-ES",
            "gn-PY",
            "gsw-CH",
            "gsw-FR",
            "gsw-LI",
            "gu-IN",
            "guz-KE",
            "gv-IM",
            "ha-Latn-GH",
            "ha-Latn-NE",
            "ha-Latn-NG",
            "haw-US",
            "he-IL",
            "hi-IN",
            "hr-BA",
            "hr-HR",
            "hsb-DE",
            "hu-HU",
            "hy-AM",
            "ia-001",
            "ia-FR",
            "ibb-NG",
            "id-ID",
            "ig-NG",
            "ii-CN",
            "is-IS",
            "it-CH",
            "it-IT",
            "it-SM",
            "iu-Cans-CA",
            "iu-Latn-CA",
            "ja-JP",
            "jgo-CM",
            "jmc-TZ",
            "jv-Java-ID",
            "jv-Latn-ID",
            "ka-GE",
            "kab-DZ",
            "kam-KE",
            "kde-TZ",
            "kea-CV",
            "khq-ML",
            "ki-KE",
            "kk-KZ",
            "kkj-CM",
            "kl-GL",
            "kln-KE",
            "km-KH",
            "kn-IN",
            "ko-KP",
            "ko-KR",
            "kok-IN",
            "kr-NG",
            "ks-Arab-IN",
            "ks-Deva-IN",
            "ksb-TZ",
            "ksf-CM",
            "ksh-DE",
            "ku-Arab-IQ",
            "ku-Arab-IR",
            "kw-GB",
            "ky-KG",
            "la-001",
            "lag-TZ",
            "lb-LU",
            "lg-UG",
            "lkt-US",
            "ln-AO",
            "ln-CD",
            "ln-CF",
            "ln-CG",
            "lo-LA",
            "lrc-IQ",
            "lrc-IR",
            "lt-LT",
            "lu-CD",
            "luo-KE",
            "luy-KE",
            "lv-LV",
            "mas-KE",
            "mas-TZ",
            "mer-KE",
            "mfe-MU",
            "mg-MG",
            "mgh-MZ",
            "mgo-CM",
            "mi-NZ",
            "mk-MK",
            "ml-IN",
            "mn-MN",
            "mn-Mong-CN",
            "mn-Mong-MN",
            "mni-IN",
            "moh-CA",
            "mr-IN",
            "ms-BN",
            "ms-MY",
            "ms-SG",
            "mt-MT",
            "mua-CM",
            "my-MM",
            "mzn-IR",
            "naq-NA",
            "nb-NO",
            "nb-SJ",
            "nd-ZW",
            "ne-IN",
            "ne-NP",
            "nl-AW",
            "nl-BE",
            "nl-BQ",
            "nl-CW",
            "nl-NL",
            "nl-SR",
            "nl-SX",
            "nmg-CM",
            "nn-NO",
            "nnh-CM",
            "nqo-GN",
            "nr-ZA",
            "nso-ZA",
            "nus-SS",
            "nyn-UG",
            "oc-FR",
            "om-ET",
            "om-KE",
            "or-IN",
            "os-GE",
            "os-RU",
            "pa-Arab-PK",
            "pa-IN",
            "pap-029",
            "pl-PL",
            "prg-001",
            "prs-AF",
            "ps-AF",
            "pt-AO",
            "pt-BR",
            "pt-CV",
            "pt-GW",
            "pt-MO",
            "pt-MZ",
            "pt-PT",
            "pt-ST",
            "pt-TL",
            "quc-Latn-GT",
            "quz-BO",
            "quz-EC",
            "quz-PE",
            "rm-CH",
            "rn-BI",
            "ro-MD",
            "ro-RO",
            "rof-TZ",
            "ru-BY",
            "ru-KG",
            "ru-KZ",
            "ru-MD",
            "ru-RU",
            "ru-UA",
            "rw-RW",
            "rwk-TZ",
            "sa-IN",
            "sah-RU",
            "saq-KE",
            "sbp-TZ",
            "sd-Arab-PK",
            "sd-Deva-IN",
            "se-FI",
            "se-NO",
            "se-SE",
            "seh-MZ",
            "ses-ML",
            "sg-CF",
            "shi-Latn-MA",
            "shi-Tfng-MA",
            "si-LK",
            "sk-SK",
            "sl-SI",
            "sma-NO",
            "sma-SE",
            "smj-NO",
            "smj-SE",
            "smn-FI",
            "sms-FI",
            "sn-Latn-ZW",
            "so-DJ",
            "so-ET",
            "so-KE",
            "so-SO",
            "sq-AL",
            "sq-MK",
            "sq-XK",
            "sr-Cyrl-BA",
            "sr-Cyrl-ME",
            "sr-Cyrl-RS",
            "sr-Cyrl-XK",
            "sr-Latn-BA",
            "sr-Latn-ME",
            "sr-Latn-RS",
            "sr-Latn-XK",
            "ss-SZ",
            "ss-ZA",
            "ssy-ER",
            "st-LS",
            "st-ZA",
            "sv-AX",
            "sv-FI",
            "sv-SE",
            "sw-CD",
            "sw-KE",
            "sw-TZ",
            "sw-UG",
            "syr-SY",
            "ta-IN",
            "ta-LK",
            "ta-MY",
            "ta-SG",
            "te-IN",
            "teo-KE",
            "teo-UG",
            "tg-Cyrl-TJ",
            "th-TH",
            "ti-ER",
            "ti-ET",
            "tig-ER",
            "tk-TM",
            "tn-BW",
            "tn-ZA",
            "to-TO",
            "tr-CY",
            "tr-TR",
            "ts-ZA",
            "tt-RU",
            "twq-NE",
            "tzm-Arab-MA",
            "tzm-Latn-DZ",
            "tzm-Latn-MA",
            "tzm-Tfng-MA",
            "ug-CN",
            "uk-UA",
            "ur-IN",
            "ur-PK",
            "uz-Arab-AF",
            "uz-Cyrl-UZ",
            "uz-Latn-UZ",
            "vai-Latn-LR",
            "vai-Vaii-LR",
            "ve-ZA",
            "vi-VN",
            "vo-001",
            "vun-TZ",
            "wae-CH",
            "wal-ET",
            "wo-SN",
            "xh-ZA",
            "xog-UG",
            "yav-CM",
            "yi-001",
            "yo-BJ",
            "yo-NG",
            "zgh-Tfng-MA",
            "zh-CN",
            "zh-Hans-HK",
            "zh-Hans-MO",
            "zh-HK",
            "zh-MO",
            "zh-SG",
            "zh-TW",
            "zu-ZA"
        };
        private static string[] neutralCulturePool = new string[]
        {
            "aa",
            "af",
            "agq",
            "ak",
            "am",
            "ar",
            "arn",
            "as",
            "asa",
            "ast",
            "az",
            "az-Cyrl",
            "az-Latn",
            "ba",
            "bas",
            "be",
            "bem",
            "bez",
            "bg",
            "bin",
            "bm",
            "bm-Latn",
            "bn",
            "bo",
            "br",
            "brx",
            "bs",
            "bs-Cyrl",
            "bs-Latn",
            "byn",
            "ca",
            "ce",
            "cgg",
            "chr",
            "chr-Cher",
            "co",
            "cs",
            "cu",
            "cy",
            "da",
            "dav",
            "de",
            "dje",
            "dsb",
            "dua",
            "dv",
            "dyo",
            "dz",
            "ebu",
            "ee",
            "el",
            "en",
            "eo",
            "es",
            "et",
            "eu",
            "ewo",
            "fa",
            "ff",
            "ff-Latn",
            "fi",
            "fil",
            "fo",
            "fr",
            "fur",
            "fy",
            "ga",
            "gd",
            "gl",
            "gn",
            "gsw",
            "gu",
            "guz",
            "gv",
            "ha",
            "ha-Latn",
            "haw",
            "he",
            "hi",
            "hr",
            "hsb",
            "hu",
            "hy",
            "ia",
            "ibb",
            "id",
            "ig",
            "ii",
            "is",
            "it",
            "iu",
            "iu-Cans",
            "iu-Latn",
            "ja",
            "jgo",
            "jmc",
            "jv",
            "jv-Java",
            "jv-Latn",
            "ka",
            "kab",
            "kam",
            "kde",
            "kea",
            "khq",
            "ki",
            "kk",
            "kkj",
            "kl",
            "kln",
            "km",
            "kn",
            "ko",
            "kok",
            "kr",
            "ks",
            "ks-Arab",
            "ks-Deva",
            "ksb",
            "ksf",
            "ksh",
            "ku",
            "ku-Arab",
            "kw",
            "ky",
            "la",
            "lag",
            "lb",
            "lg",
            "lkt",
            "ln",
            "lo",
            "lrc",
            "lt",
            "lu",
            "luo",
            "luy",
            "lv",
            "mas",
            "mer",
            "mfe",
            "mg",
            "mgh",
            "mgo",
            "mi",
            "mk",
            "ml",
            "mn",
            "mn-Cyrl",
            "mn-Mong",
            "mni",
            "moh",
            "mr",
            "ms",
            "mt",
            "mua",
            "my",
            "mzn",
            "naq",
            "nb",
            "nd",
            "ne",
            "nl",
            "nmg",
            "nn",
            "nnh",
            "no",
            "nqo",
            "nr",
            "nso",
            "nus",
            "nyn",
            "oc",
            "om",
            "or",
            "os",
            "pa",
            "pa-Arab",
            "pap",
            "pl",
            "prg",
            "prs",
            "ps",
            "pt",
            "quc",
            "quc-Latn",
            "quz",
            "rm",
            "rn",
            "ro",
            "rof",
            "ru",
            "rw",
            "rwk",
            "sa",
            "sah",
            "saq",
            "sbp",
            "sd",
            "sd-Arab",
            "sd-Deva",
            "se",
            "seh",
            "ses",
            "sg",
            "shi",
            "shi-Latn",
            "shi-Tfng",
            "si",
            "sk",
            "sl",
            "sma",
            "smj",
            "smn",
            "sms",
            "sn",
            "sn-Latn",
            "so",
            "sq",
            "sr",
            "sr-Cyrl",
            "sr-Latn",
            "ss",
            "ssy",
            "st",
            "sv",
            "sw",
            "syr",
            "ta",
            "te",
            "teo",
            "tg",
            "tg-Cyrl",
            "th",
            "ti",
            "tig",
            "tk",
            "tn",
            "to",
            "tr",
            "ts",
            "tt",
            "twq",
            "tzm",
            "tzm-Arab",
            "tzm-Latn",
            "tzm-Tfng",
            "ug",
            "uk",
            "ur",
            "uz",
            "uz-Arab",
            "uz-Cyrl",
            "uz-Latn",
            "vai",
            "vai-Latn",
            "vai-Vaii",
            "ve",
            "vi",
            "vo",
            "vun",
            "wae",
            "wal",
            "wo",
            "xh",
            "xog",
            "yav",
            "yi",
            "yo",
            "zgh",
            "zgh-Tfng",
            "zh",
            "zh-Hans",
            "zh-Hant",
            "zu",
            "zh-CHS",
            "zh-CHT"
        };
        #endregion culturePool
        private static CultureInfo[] supportedSpecificCultures;
        private static CultureInfo[] supportedNeutralCultures;

        static CultureInfoSupport()
        {
            supportedSpecificCultures = LoadSupportedCultures(specificCulturePool);
            supportedNeutralCultures = LoadSupportedCultures(neutralCulturePool);
        }

        private static CultureInfo[] LoadSupportedCultures(string[] culturePool)
        {
            var cultures = new List<CultureInfo>();

            foreach (var culture in specificCulturePool)
            {
                try
                {
                    cultures.Add(new CultureInfo(culture));
                }
                catch (Exception)
                {
                    // ignore
                }
            }

            return cultures.ToArray();
        }
#endif

        public static CultureInfo[] GetNeutralAndSpecificCultures()
        {
#if NETSTANDARD
            return supportedNeutralCultures.Union(supportedSpecificCultures).ToArray();
#else
            return CultureInfo.GetCultures(CultureTypes.SpecificCultures | CultureTypes.NeutralCultures);
#endif

        }
    }
}
