#nullable disable
using System.Globalization;

namespace EllieBot.Modules.Administration;

public partial class Administration
{
    [Group]
    public partial class LocalizationCommands : EllieModule
    {
        private static readonly IReadOnlyDictionary<string, string> _supportedLocales = new Dictionary<string, string>
        {
            { "ar", "العربية" },
            { "zh-TW", "繁體中文, 台灣" },
            { "zh-CN", "简体中文, 中华人民共和国" },
            { "nl-NL", "Nederlands, Nederland" },
            { "en-US", "English, United States" },
            { "fr-FR", "Français, France" },
            { "cs-CZ", "Čeština, Česká republika" },
            { "da-DK", "Dansk, Danmark" },
            { "de-DE", "Deutsch, Deutschland" },
            { "he-IL", "עברית, ישראל" },
            { "hu-HU", "Magyar, Magyarország" },
            { "id-ID", "Bahasa Indonesia, Indonesia" },
            { "it-IT", "Italiano, Italia" },
            { "ja-JP", "日本語, 日本" },
            { "ko-KR", "한국어, 대한민국" },
            { "nb-NO", "Norsk, Norge" },
            { "pl-PL", "Polski, Polska" },
            { "pt-BR", "Português Brasileiro, Brasil" },
            { "ro-RO", "Română, România" },
            { "ru-RU", "Русский, Россия" },
            { "sr-Cyrl-RS", "Српски, Србија" },
            { "es-ES", "Español, España" },
            { "sv-SE", "Svenska, Sverige" },
            { "tr-TR", "Türkçe, Türkiye" },
            { "ts-TS", "Tsundere, You Baka" },
            { "uk-UA", "Українська, Україна" }
        };

        [Cmd]
        [RequireContext(ContextType.Guild)]
        [Priority(0)]
        public async Task LanguageSet()
            => await Response().Confirm(strs.lang_set_show(Format.Bold(Culture.ToString()),
                Format.Bold(Culture.NativeName))).SendAsync();

        [Cmd]
        [RequireContext(ContextType.Guild)]
        [UserPerm(GuildPerm.Administrator)]
        [Priority(1)]
        public async Task LanguageSet(string name)
        {
            try
            {
                CultureInfo ci;
                if (name.Trim().ToLowerInvariant() == "default")
                {
                    _localization.RemoveGuildCulture(ctx.Guild);
                    ci = _localization.DefaultCultureInfo;
                }
                else
                {
                    ci = new CultureInfo(name);
                    if (!_supportedLocales.ContainsKey(ci.Name))
                    {
                        await LanguagesList();
                        return;
                    }
                    
                    _localization.SetGuildCulture(ctx.Guild, ci);
                }

                var nativeName = ci.NativeName;
                if (ci.Name == "ts-TS")
                    nativeName = _supportedLocales[ci.Name];
                await Response().Confirm(strs.lang_set(Format.Bold(ci.ToString()), Format.Bold(nativeName))).SendAsync();
            }
            catch (Exception)
            {
                await Response().Error(strs.lang_set_fail).SendAsync();
            }
        }

        [Cmd]
        public async Task LanguageSetDefault()
        {
            var cul = _localization.DefaultCultureInfo;
            await Response().Error(strs.lang_set_bot_show(cul, cul.NativeName)).SendAsync();
        }

        [Cmd]
        [OwnerOnly]
        public async Task LanguageSetDefault(string name)
        {
            try
            {
                CultureInfo ci;
                if (name.Trim().ToLowerInvariant() == "default")
                {
                    _localization.ResetDefaultCulture();
                    ci = _localization.DefaultCultureInfo;
                }
                else
                {
                    ci = new CultureInfo(name);
                    if (!_supportedLocales.ContainsKey(ci.Name))
                    {
                        await LanguagesList();
                        return;
                    }
                    _localization.SetDefaultCulture(ci);
                }

                await Response().Confirm(strs.lang_set_bot(Format.Bold(ci.ToString()),
                    Format.Bold(ci.NativeName))).SendAsync();
            }
            catch (Exception)
            {
                await Response().Error(strs.lang_set_fail).SendAsync();
            }
        }

        [Cmd]
        public async Task LanguagesList()
            => await Response().Embed(_sender.CreateEmbed()
                                               .WithOkColor()
                                               .WithTitle(GetText(strs.lang_list))
                                               .WithDescription(string.Join("\n",
                                                   _supportedLocales.Select(
                                                       x => $"{Format.Code(x.Key),-10} => {x.Value}")))).SendAsync();
    }
}
/* list of language codes for reference. 
 * taken from https://github.com/dotnet/coreclr/blob/ee5862c6a257e60e263537d975ab6c513179d47f/src/mscorlib/src/System/Globalization/CultureData.cs#L192
            { "029", "en-029" },
            { "AE",  "ar-AE" },
            { "AF",  "prs-AF" },
            { "AL",  "sq-AL" },
            { "AM",  "hy-AM" },
            { "AR",  "es-AR" },
            { "AT",  "de-AT" },
            { "AU",  "en-AU" },
            { "AZ",  "az-Cyrl-AZ" },
            { "BA",  "bs-Latn-BA" },
            { "BD",  "bn-BD" },
            { "BE",  "nl-BE" },
            { "BG",  "bg-BG" },
            { "BH",  "ar-BH" },
            { "BN",  "ms-BN" },
            { "BO",  "es-BO" },
            { "BR",  "pt-BR" },
            { "BY",  "be-BY" },
            { "BZ",  "en-BZ" },
            { "CA",  "en-CA" },
            { "CH",  "it-CH" },
            { "CL",  "es-CL" },
            { "CN",  "zh-CN" },
            { "CO",  "es-CO" },
            { "CR",  "es-CR" },
            { "CS",  "sr-Cyrl-CS" },
            { "CZ",  "cs-CZ" },
            { "DE",  "de-DE" },
            { "DK",  "da-DK" },
            { "DO",  "es-DO" },
            { "DZ",  "ar-DZ" },
            { "EC",  "es-EC" },
            { "EE",  "et-EE" },
            { "EG",  "ar-EG" },
            { "ES",  "es-ES" },
            { "ET",  "am-ET" },
            { "FI",  "fi-FI" },
            { "FO",  "fo-FO" },
            { "FR",  "fr-FR" },
            { "GB",  "en-GB" },
            { "GE",  "ka-GE" },
            { "GL",  "kl-GL" },
            { "GR",  "el-GR" },
            { "GT",  "es-GT" },
            { "HK",  "zh-HK" },
            { "HN",  "es-HN" },
            { "HR",  "hr-HR" },
            { "HU",  "hu-HU" },
            { "ID",  "id-ID" },
            { "IE",  "en-IE" },
            { "IL",  "he-IL" },
            { "IN",  "hi-IN" },
            { "IQ",  "ar-IQ" },
            { "IR",  "fa-IR" },
            { "IS",  "is-IS" },
            { "IT",  "it-IT" },
            { "IV",  "" },
            { "JM",  "en-JM" },
            { "JO",  "ar-JO" },
            { "JP",  "ja-JP" },
            { "KE",  "sw-KE" },
            { "KG",  "ky-KG" },
            { "KH",  "km-KH" },
            { "KR",  "ko-KR" },
            { "KW",  "ar-KW" },
            { "KZ",  "kk-KZ" },
            { "LA",  "lo-LA" },
            { "LB",  "ar-LB" },
            { "LI",  "de-LI" },
            { "LK",  "si-LK" },
            { "LT",  "lt-LT" },
            { "LU",  "lb-LU" },
            { "LV",  "lv-LV" },
            { "LY",  "ar-LY" },
            { "MA",  "ar-MA" },
            { "MC",  "fr-MC" },
            { "ME",  "sr-Latn-ME" },
            { "MK",  "mk-MK" },
            { "MN",  "mn-MN" },
            { "MO",  "zh-MO" },
            { "MT",  "mt-MT" },
            { "MV",  "dv-MV" },
            { "MX",  "es-MX" },
            { "MY",  "ms-MY" },
            { "NG",  "ig-NG" },
            { "NI",  "es-NI" },
            { "NL",  "nl-NL" },
            { "NO",  "nn-NO" },
            { "NP",  "ne-NP" },
            { "NZ",  "en-NZ" },
            { "OM",  "ar-OM" },
            { "PA",  "es-PA" },
            { "PE",  "es-PE" },
            { "PH",  "en-PH" },
            { "PK",  "ur-PK" },
            { "PL",  "pl-PL" },
            { "PR",  "es-PR" },
            { "PT",  "pt-PT" },
            { "PY",  "es-PY" },
            { "QA",  "ar-QA" },
            { "RO",  "ro-RO" },
            { "RS",  "sr-Latn-RS" },
            { "RU",  "ru-RU" },
            { "RW",  "rw-RW" },
            { "SA",  "ar-SA" },
            { "SE",  "sv-SE" },
            { "SG",  "zh-SG" },
            { "SI",  "sl-SI" },
            { "SK",  "sk-SK" },
            { "SN",  "wo-SN" },
            { "SV",  "es-SV" },
            { "SY",  "ar-SY" },
            { "TH",  "th-TH" },
            { "TJ",  "tg-Cyrl-TJ" },
            { "TM",  "tk-TM" },
            { "TN",  "ar-TN" },
            { "TR",  "tr-TR" },
            { "TT",  "en-TT" },
            { "TW",  "zh-TW" },
            { "UA",  "uk-UA" },
            { "US",  "en-US" },
            { "UY",  "es-UY" },
            { "UZ",  "uz-Cyrl-UZ" },
            { "VE",  "es-VE" },
            { "VN",  "vi-VN" },
            { "YE",  "ar-YE" },
            { "ZA",  "af-ZA" },
            { "ZW",  "en-ZW" }
 */