using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VRH.Log4Pro.MultiLanguageManager;

namespace Vrh.OneReport.Lib.Areas.OneReport.Helpers
{
    public class LangHelper : IDisposable
    {
        #region static variables

        protected static bool _CollectWordCodes = false;

        #endregion static variables

        #region instance variables

        protected HashSet<string> _usedWordCodes = null;

        #endregion instance variables

        #region instance methods

        public LangHelper()
        {
        }

        public LangHelper(LangHelper orig)
        {
            _usedWordCodes = orig._usedWordCodes;
            if (_usedWordCodes == null && _CollectWordCodes)
            {
                orig._usedWordCodes = _usedWordCodes = new HashSet<string>();
            }
        }

        /// <summary>
        /// Fordítás lekérdezése a MultILanguageManager használatával, wordCode alapján az aktális felhasználónak megfelelő nyelven
        /// </summary>
        /// <param name="wordCode">Szó azonosító kód</param>
        /// <param name="defaultText">Alapértelmezett fisszaadott érték, ha nem elérhető a MultiLanguageManager</param>
        /// <returns>A fordítás a megfelelő nyelven</returns>
        public virtual string GetTranslation(string wordCode, string defaultText = null)
        {
            return MultiLanguageManager.GetTranslation(wordCode, defaultText);
        }

        /// <summary>
        /// Fordítás hozzáadása vagy módosítása amennyiben létezik a nyelv és a szó azonosító
        /// </summary>
        /// <param name="wordCode">Szó azonosító kód</param>
        /// <param name="text">A fordítása megadott nyelven</param>
        /// <param name="languageCode">Nyelvi azonosító kód</param>
        public virtual void StoreTranslation(string WordCode, string text, string languageCode = "hu-HU")
        {
            MultiLanguageManager.AddOrModifyWord(WordCode, text);
            MultiLanguageManager.AddOrModifyTranslation(languageCode, WordCode, text, true, false);
        }

        protected void AddPrefixToWordCode(string WordCode, string Prefix)
        {
            MultiLanguageManager.AddNewFirstTagToWordCode(WordCode, Prefix);
        }

        protected HashSet<string> GetStoredWordCodesForGroup(string group)
        {
            return new HashSet<string>(MultiLanguageManager.GetWordCodesAtGroup(group));
        }

        #endregion instance methods

        #region static methods

        public static void CollectWordCodes(bool collect)
        {
            _CollectWordCodes = collect;
        }

        public static void InitializeAPMWordCodes()
        {
            LangHelperNS.InitializeWordCodes();
        }

        protected static void InitializeTranslation(string nameSpace, Dictionary<string, string> words, string languageCode = "hu-HU", HashSet<string> wordcodelist = null)
        {
            string fullwcode;

            foreach (var word in words)
            {
                fullwcode = nameSpace + word.Key;
                MultiLanguageManager.AddOrModifyWord(fullwcode, word.Value);
                MultiLanguageManager.AddOrModifyTranslation(languageCode, fullwcode, word.Value, true, false);
                if (wordcodelist != null)
                    wordcodelist.Add(fullwcode);
            }
        }

        public static HashSet<string> PurgeAllUnusedWordCodes(string moduleNamespace)
        {
            return LangHelperNS.PurgeAllUnusedWordCodes(moduleNamespace);
        }

        #endregion static methods

        #region IDispose

        public void Dispose()
        {
        }

        #endregion
    }
}
