using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;

namespace FVS
{
    public static class EditorL10n
    {
        private static readonly Dictionary<string, Dictionary<string, string>> All = new()
        {
            ["zh-CN"] = new()
            {
                ["Menu_CreateComponent"]    = "FVS/创建FVS-Unity通信组件",
                ["Menu_BuildSDK"]           = "FVS/打包/构建FVSUnitySDK包",
                ["Menu_BuildSceneConfig"]   = "FVS/打包/构建FVSUnity场景配置",

                ["Header_SceneConfigJson"]      = "场景配置JSON",
                ["Header_UnityEventList"]       = "Unity事件列表",
                ["Header_UnityActionList"]      = "UnityAction列表",
                ["Header_SceneManagement"]      = "场景管理",
                ["Header_ActionName"]           = "Action名称",
                ["Header_ActionDisplayName"]    = "Action展示名",
                ["Header_EventName"]            = "事件名",
                ["Header_EventDisplayName"]     = "事件展示名",
                ["Header_ParameterList"]        = "参数列表",
                ["Header_ParameterKey"]         = "参数key",
                ["Header_ParameterDisplayName"] = "参数展示名",
                ["Header_CurrentScene"]         = "当前场景",
                ["Header_SceneList"]            = "场景列表",
                ["Header_SceneName"]            = "场景名",
                ["Header_SceneDisplayName"]     = "场景展示名",
                ["Header_StyleDisplayName"]     = "显示名",

                ["Tooltip_RotateSpeed"]    = "旋转速度",
                ["Tooltip_TranslateSpeed"] = "平移速度",
                ["Tooltip_ZoomSpeed"]      = "缩放速度",
                ["Tooltip_ZoomMax"]        = "缩放最远距离",
                ["Tooltip_ZoomMin"]        = "缩放最近距离",

                ["Msg_AddFVSFirst"]        = "请先添加FVS-Unity通信组件",
            },
            ["en"] = new()
            {
                ["Menu_CreateComponent"]    = "FVS/Add FVS-Unity Communication Component",
                ["Menu_BuildSDK"]           = "FVS/Package/Generate FVS-Unity-SDK",
                ["Menu_BuildSceneConfig"]   = "FVS/Package/Generate FVS-Unity Scene Configuration",

                ["Header_SceneConfigJson"]      = "Scene Configuration JSON",
                ["Header_UnityEventList"]       = "Unity Event List",
                ["Header_UnityActionList"]      = "Unity Action List",
                ["Header_SceneManagement"]      = "Scene Management",
                ["Header_ActionName"]           = "Action Name",
                ["Header_ActionDisplayName"]    = "Action Display Name",
                ["Header_EventName"]            = "Event Name",
                ["Header_EventDisplayName"]     = "Event Display Name",
                ["Header_ParameterList"]        = "Parameter List",
                ["Header_ParameterKey"]         = "Parameter Key",
                ["Header_ParameterDisplayName"] = "Parameter Display Name",
                ["Header_CurrentScene"]         = "Current Scene",
                ["Header_SceneList"]            = "Scene List",
                ["Header_SceneName"]            = "Scene Name",
                ["Header_SceneDisplayName"]     = "Scene Display Name",
                ["Header_StyleDisplayName"]     = "Display Name",

                ["Tooltip_RotateSpeed"]    = "Rotate Speed",
                ["Tooltip_TranslateSpeed"] = "Translate Speed",
                ["Tooltip_ZoomSpeed"]      = "Zoom Speed",
                ["Tooltip_ZoomMax"]        = "Max Zoom Distance",
                ["Tooltip_ZoomMin"]        = "Min Zoom Distance",

                ["Msg_AddFVSFirst"]        = "Add the FVS-Unity communication component first",
            },
        };

        private static readonly string[] Fallback = { "en" };

        public static string CurrentLocaleCode => DetectCurrentLocale();

        public static string Get(string key)
        {
            if (All.TryGetValue(CurrentLocaleCode, out var dict) && dict.TryGetValue(key, out var v))
                return v;
            foreach (var lang in Fallback)
                if (All.TryGetValue(lang, out dict) && dict.TryGetValue(key, out v))
                    return v;
            return key;
        }

        private static PropertyInfo _editorLangProp;
        private static bool _editorLangPropQueried;

        private static string DetectCurrentLocale()
        {
            var dbLang = GetEditorLanguage();
            var prefLocale = EditorPrefs.GetString("Editor.kEditorLocale", "");
            var sysLang = Application.systemLanguage;

            string result;
            if (dbLang != SystemLanguage.Unknown)
                result = IsChinese(dbLang) ? "zh-CN" : "en";
            else if (!string.IsNullOrEmpty(prefLocale))
                result = (prefLocale.ToLowerInvariant().Contains("zh") || prefLocale.ToLowerInvariant().Contains("chinese")) ? "zh-CN" : "en";
            else
                result = IsChinese(sysLang) ? "zh-CN" : "en";

            Debug.Log($"[FVS] dbLang={dbLang}  prefLocale=\"{prefLocale}\"  sysLang={sysLang}  → {result}");
            return result;
        }

        private static SystemLanguage GetEditorLanguage()
        {
            if (!_editorLangPropQueried)
            {
                _editorLangPropQueried = true;
                var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.LocalizationDatabase");
                _editorLangProp = type?.GetProperty("currentEditorLanguage",
                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
            }
            if (_editorLangProp != null)
                return (SystemLanguage)_editorLangProp.GetValue(null);
            return SystemLanguage.Unknown;
        }

        private static bool IsChinese(SystemLanguage lang)
        {
            return lang == SystemLanguage.Chinese
                || lang == SystemLanguage.ChineseSimplified
                || lang == SystemLanguage.ChineseTraditional;
        }
    }
}
