using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;
#if UNITY_2020_1_OR_NEWER
[assembly: UnityEditor.Localization]
#elif UNITY_2019_3_OR_NEWER
[assembly: UnityEditor.Localization.Editor.Localization]
#endif
namespace Unity.Tutorials.Core.Editor
{
    /// 
    /// A helper class for Localization.
    /// 
    static class Localization 
    {
        const string k_EnableEditorLocalizationPreference = "Editor.kEnableEditorLocalization";
        const string k_EditorLocalePreference = "Editor.kEditorLocale";
        internal const string k_EnableEditorLocalizationProperty = "enableEditorLocalization";
        internal const string k_CurrentEditorLanguageProperty = "currentEditorLanguage";
        internal const string k_GetDefaultEditorLanguageMethod = "GetDefaultEditorLanguage";
        [InitializeOnLoadMethod]
        static void ForceEnableLocalization()
        {
            if (EditorPrefs.GetBool(k_EnableEditorLocalizationPreference)) { return; }
            var localizationDatabase = Type.GetType("UnityEditor.LocalizationDatabase, UnityEditor.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
            var enableEditorLocalization = localizationDatabase.GetProperty(k_EnableEditorLocalizationProperty);
            enableEditorLocalization.SetValue(null, true);
            EditorPrefs.SetBool(k_EnableEditorLocalizationPreference, true);
            string currentLanguage = EditorPrefs.GetString(k_EditorLocalePreference);
            if (!string.IsNullOrEmpty(currentLanguage)) { return; }
            var currentEditorLanguage = localizationDatabase.GetProperty(k_CurrentEditorLanguageProperty);
            SystemLanguage defaultEditorLanguage = (SystemLanguage)localizationDatabase.GetMethod(k_GetDefaultEditorLanguageMethod, BindingFlags.Public | BindingFlags.Static).Invoke(null, null);
            currentEditorLanguage.SetValue(null, defaultEditorLanguage);
            EditorPrefs.SetString(k_EditorLocalePreference, currentEditorLanguage.GetValue(null).ToString());
        } 
        /// 
        /// Routes the call to the correct, or none, Tr() implementation depending on the used Unity version.
        /// See https://docs.unity3d.com/ScriptReference/Localization.Editor.Localization.Tr.html.
        /// 
        /// 
        /// 
        internal static string Tr(string stringID)
        {
            if (string.IsNullOrEmpty(stringID))
            {
                return string.Empty;
            }
#if UNITY_2020_1_OR_NEWER
            return UnityEditor.L10n.Tr(stringID);
#elif UNITY_2019_3_OR_NEWER
            return UnityEditor.Localization.Editor.Localization.Tr(stringID);
#else
            return stringID;
#endif
        }
    }
}