using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using PackingPress.Common.Configuration;

namespace PackingPress.Common
{

    public enum LanguageEnum
    {
        Chinese,
        English,
        Romania
    }


    public class TranslateHelper
    {
        public const string ChineseLanguageKey = "Chinese";
        public const string EnglishLanguageKey = "English";

        private static ConfigManager _languageManager;
        private static string _currentLanguage;

        private static readonly Dictionary<string, string> DefaultNls = new Dictionary<string, string>
        {
            {ChineseLanguageKey, "zh-CN"},
            {EnglishLanguageKey, "en-US"},
        };

        public static readonly List<string> XingLingHuiServerRegion = new List<string>
        {
            "as","bn","bo","brx","dv","dz","ee", "en-hk","en-id","en-in","en-mo",
            "en-my","en-ph","en-pk","en-sg","fil","gu","hi","id","ja","jv","jv-java",
            "jv-latn","km","kn","ko","ks","ks-arab","ks-deva","ksb","ky","lo","ml",
            "mn","mn-cyrl","mn-mong","mni","mr","ms","my","ne","or","pa","pa-arab","ps",
            "sa","sd","sd-arab","sd-deva","si","ta","te","th","ug","ur","vi","zh",
            "zh-hans","zh-hant","zh-chs","zh-cht","zh-cn","zh-sg","zh-tw","zh-hk","zh-mo",
        };

        private static readonly Dictionary<string, string> CultureToLanguage = new Dictionary<string, string>();
        private static readonly Dictionary<string, string> LanguageResources = new Dictionary<string, string>();

        /// <summary>
        /// Gets the language names which helper supported.
        /// </summary>
        public static string[] SupportedLanguages => DefaultNls.Keys.ToArray();

        /// <summary>
        /// Gets or sets the current language.
        /// </summary>
        public static string CurrentLanguage
        {
            get { return _currentLanguage; }
            set
            {
                if (_currentLanguage != value)
                {
                    _currentLanguage = value;
                    Initialize(_currentLanguage);
                }
            }
        }


        // Constructors 
        static TranslateHelper()
        {
            foreach (KeyValuePair<string, string> keyValuePair in DefaultNls)
            {
                CultureToLanguage[keyValuePair.Value.ToLower()] = keyValuePair.Key;
            }
            var currentLanguage = CultureInfo.CurrentCulture.Name.ToLower();
            if (currentLanguage == "zh-sg")//if	Singapore is zh-sg ,system language is chinese
            {
                currentLanguage = "zh-cn";
            }
            CurrentLanguage = CultureToLanguage.ContainsKey(currentLanguage)
                ? CultureToLanguage[currentLanguage]
                : "English";
        }

        // Methods 
        public static string GetDefaultSystemLanguage()
        {
            var currentLanguage = CultureInfo.CurrentCulture.Name.ToLower();
            return CultureToLanguage.ContainsKey(currentLanguage)
                ? CultureToLanguage[currentLanguage]
                : "English";
        }
        /// <summary>
        /// Add language and related resource into helper.
        /// </summary>
        /// <param name="language"></param>
        /// <param name="resource"></param>
        public static void AddLanguageResource(string language, string resource)
        {
	        if (!LanguageResources.Keys.Contains(language))
	        {
				LanguageResources.Add(language, resource);
			}
        }

        public static LanguageEnum IsChineseCultureInfo()
        {
            var currentLanguage = CultureInfo.CurrentCulture.Name.ToLower();
            if (currentLanguage.StartsWith("zh")|| XingLingHuiServerRegion.Contains(currentLanguage))
            {
                return LanguageEnum.Chinese;
            }
            if (currentLanguage.StartsWith("ro"))
            {
                return LanguageEnum.Romania;
            }
            return LanguageEnum.English;
        }

        /// <summary>
        /// Initialize TranslateHelper with specific language.
        /// </summary>
        /// <param name="languageName">"Chinese" "English"</param>
        public static void Initialize(string languageName)
        {
            CurrentLanguage = languageName;
            LoadTranslationResource();
        }

        private static void LoadTranslationResource()
        {
            if (LanguageResources.ContainsKey(CurrentLanguage))
            {
                _languageManager = new ConfigManager(LanguageResources[CurrentLanguage]);
            }
        }

        /// <summary>
        /// Update a translation of current language.
        /// </summary>
        /// <param name="key">The key of the translation</param>
        /// <param name="value">The updated value.</param>
        public static void UpdateTranslation(string key, string value)
        {
            if (_languageManager == null)
            {
                if (LanguageResources.ContainsKey(CurrentLanguage))
                {
                    _languageManager = new ConfigManager(LanguageResources[CurrentLanguage]);
                }
            }
            if (!string.IsNullOrEmpty(key))
            {
                ((IConfigUpdater)_languageManager).SetValue("Languages", key, value);
            }
        }

        /// <summary>
        /// Translate to target Language with specified key.
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string Translate(string key)
        {
            if (_languageManager == null)
            {
                if (LanguageResources.ContainsKey(CurrentLanguage))
                {
                    _languageManager = new ConfigManager(LanguageResources[CurrentLanguage]);
                }
            }
            if (string.IsNullOrEmpty(key))
            {
                return string.Empty;
            }
            var translatedValue = _languageManager?.GetValue("Languages", key, string.Empty);
            if (string.IsNullOrEmpty(translatedValue))
            {
                return key;
            }
            return translatedValue.Replace("\\r\\n",Environment.NewLine);
        }
    }
}