﻿using Newtonsoft.Json;
using Post_Publisher.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Web.Hosting;

namespace Post_Publisher.Localizations
{
	/// <summary>
	/// Retrieves translated strings 현지화 변역 스트링을 가져오는 클래스
	/// </summary>
	public class L
	{
		/// <summary>
		/// Retrieves translated strings 현지화 번역 스트링을 가져옵니다.
		/// </summary>
		/// <param name="category">Category of string 번역 스트링의 카테고리</param>
		/// <param name="item">Item name of string 번역 스트링의 이름</param>
		/// <returns>Translated string 현지화 번역 스트링</returns>
		public static string G(string category, string item)
		{
			return Localization.GetLocalizedString(category, item);
		}

		/// <summary>
		/// Retrieves translated strings 현지화 번역 스트링을 가져옵니다.
		/// </summary>
		/// <param name="category">Category of string 번역 스트링의 카테고리</param>
		/// <param name="item">Item name of string 번역 스트링의 이름</param>
		/// <param name="preview">Preview string for code legibility. Does not affect translated string retrieval process 코드 읽을 때 이해하기 쉽도록 프리뷰 스트링을 추가하세요. 번역 스트링을 가져오는 데에 영향을 전혀 미치지 않습니다.</param>
		/// <returns>Translated string 현지화 번역 스트링</returns>
		public static string G(string category, string item, string preview)
		{
			return Localization.GetLocalizedString(category, item);
		}
	}

	public class Localization
    {
        private static string CurrentLang = "en_us";

        private static Dictionary<string, Dictionary<string, string>> loc;

        public static string GetLocalizedString(string category, string item)
        {
			Dictionary<string, string> inner;

			if (!loc.TryGetValue(category, out inner))
			{
				throw new Exception(string.Format("The category '{0}' does not exist in the {1} localization file.", category, CurrentLang));
			}

			string val;
			if (!inner.TryGetValue(item, out val))
			{
				throw new Exception(string.Format("The item '{0}' does not exist under category '{1}' in the {2} localization file.", item, category, CurrentLang));
			}

			return val;
        }

        public static void LoadTranslations()
        {
			CurrentLang = Config.Site.Language;
            loc = GetTranslationResource(CurrentLang);
        }

		public static void ChangeTranslation(string code)
		{
			loc = GetTranslationResource(code);
		}

        private static Dictionary<string, Dictionary<string, string>> GetTranslationResource(string code)
        {
            return JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(File.ReadAllText(GetPath(code)));
		}

		private static string GetPath(string code)
		{
			return HostingEnvironment.MapPath("~/Localizations/Translations/" + code + ".json");
		}
    }
}