using MiniWebApi.Utilities;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Vinno.IUS.Common.Configuration;
using Vinno.vCloud.Disk;

namespace Vinno.vCloud.Disk.Language
{
    public class WebTranslateHelper
    {
        public const string ChineseLanguageKey = "Chinese";
        public const string EnglishLanguageKey = "English";

        private static readonly Dictionary<string, string> DefaultNls = new Dictionary<string, string>
        {
            {ChineseLanguageKey, "Chinese"},
            {EnglishLanguageKey, "English"},
        };

        private static readonly Dictionary<string, string> _cultureToLanguage = new Dictionary<string, string>();
        private static readonly Dictionary<string, ConfigManager> _configManagers = new Dictionary<string, ConfigManager>();

        private static readonly ViewEngine _viewEngine = new ViewEngine();
        public static string[] SupportedLanguages => DefaultNls.Keys.ToArray();

        static WebTranslateHelper()
        {
            foreach (KeyValuePair<string, string> keyValuePair in DefaultNls)
            {
                _cultureToLanguage[keyValuePair.Value.ToLower()] = keyValuePair.Key;
                var languagePath = $"Language/{keyValuePair.Key}.json";
                using (var languageStream = _viewEngine.GetResourceFile(languagePath))
                {
                    using (var reader = new StreamReader(languageStream))
                    {
                        var content = reader.ReadToEnd();
                        WebTranslateHelper.AddLanguageResource(keyValuePair.Key, content);
                        Vinno.IUS.Common.Utilities.TranslateHelper.AddLanguageResource(keyValuePair.Key, content);
                    }
                }
            }
        }

        private static void AddLanguageResource(string language, string resource)
        {
            if (!_configManagers.ContainsKey(language))
            {
                _configManagers.Add(language, new ConfigManager(resource));
            }
        }

        /// <summary>
        /// Translate to target Language with specified key.
        /// </summary>
        /// <param name="key"></param>
        /// <param name="language"></param>
        /// <returns></returns>
        public static string Translate(string key, string language = null)
        {
            var currentLanguage = language ?? ContextBase.Current?.Context.Request.Cookies["lang"]?.Value ?? "English";
            ConfigManager languageManager = null;
            if (_configManagers.ContainsKey(currentLanguage))
            {
                languageManager = _configManagers[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);
        }
    }
}