﻿using System;
using System.Collections.Generic;
using System.Text;
using JLGames.RocketDriver.Actions.i18n;
using JLGames.RocketDriver.Actions.Loaderx;
using JLGames.RocketDriver.Actions.Pool;
using JLGames.RocketDriver.Actions.Utils;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Samples.i18nDemo
{
    [Serializable]
    public class I18NDemoMode
    {
        public bool Default;
        public string ModeName;
    }

    public class I18NDemo : MonoBehaviour
    {
        [Header("Settings for Lang、 File:")] [SerializeField]
        private List<I18NDemoLang> m_Langs = new List<I18NDemoLang>()
        {
            new I18NDemoLang {Default = true, LangName = I18NLanguages.en_US},
            new I18NDemoLang {Default = false, LangName = I18NLanguages.zh_CN},
            new I18NDemoLang {Default = false, LangName = I18NLanguages.zh_CHT},
        };

        [SerializeField] private List<I18NDemoFileInfo> m_Files = new List<I18NDemoFileInfo>()
        {
            new I18NDemoFileInfo {Default = true, FileKey = "unity", FileBasePath = "i18n/unity"},
            new I18NDemoFileInfo {Default = false, FileKey = "rider", FileBasePath = "i18n/rider"},
        };

        [SerializeField] private GameObject m_LangOriginal;
        private MetaGameObjectPool m_LangPool;

        [Header("Settings for ScriptableObject:")] [SerializeField]
        private I18NSettings m_I18NSettings;

        [Header("Settings for Views:")] [SerializeField]
        private I18NDemoFileNode[] m_FileNodes;

        [SerializeField] private Dropdown m_DropdownFileKey;
        [SerializeField] private Dropdown m_DropdownLang;
        [SerializeField] private InputField m_InputFieldId;
        [SerializeField] private InputField m_InputFieldContext;
        [SerializeField] private Text m_TextResult;

        private void Awake()
        {
            m_LangPool = new MetaGameObjectPool(m_LangOriginal);
            m_LangPool.SetContainer(m_LangOriginal.transform.parent, true);
            DebugUtil.Log("Lang Code:", I18NUtils.GetDefaultLanguageCode());
        }

        private void Start()
        {
            InitLangNodes();
            InitFileNodes();
            InitLoader();
        }

        private void InitLangNodes()
        {
            m_LangPool.UpdateToSize(m_Langs.Count);
            for (var index = 0; index < m_Langs.Count; index++)
            {
                var node = m_LangPool[index].GetComponent<I18NDemoLangNode>();
                var info = m_Langs[index];
                node.UpdateView(info);
            }
        }

        private void InitFileNodes()
        {
            var size = Mathf.Min(m_Files.Count, m_FileNodes.Length);
            for (var index = 0; index < size; index++)
            {
                var node = m_FileNodes[index];
                var info = m_Files[index];
                node.UpdateView(info);
            }
        }

        private void InitLoader()
        {
            Loader.InitLoader("i18nLoaderSettings");
            Loader.InitVersion(OnVersionInited);
        }

        private void OnVersionInited(AssetBundleManifest asset, bool suc)
        {
            DebugUtil.Log("OnVersionInited:", suc);
            if (!suc) return;
            ReloadData();
        }

        public void OnClickReload()
        {
            ReloadData();
        }

        public void OnClickReload2()
        {
            ReloadData2();
        }

        private void ReloadData()
        {
            I18NManagerShared.Manager.ClearData();
            I18NManagerShared.Register.ResetRegister();
            RegisterInfos();
            RegisterFileKeys();
            I18NManagerShared.Manager.LoadData();
            UpdateSelectViews();
        }

        private void RegisterInfos()
        {
            for (var index = 0; index < m_LangPool.Count; index++)
            {
                var node = m_LangPool[index].GetComponent<I18NDemoLangNode>();
                var info = node.GetViewInfo();
                I18NManagerShared.Register.RegisterLang(info.LangName, info.LangName, info.Default);
            }
        }

        private void RegisterFileKeys()
        {
            var size = Mathf.Min(m_Files.Count, m_FileNodes.Length);
            for (var index = 0; index < size; index++)
            {
                var node = m_FileNodes[index];
                var info = node.GetViewInfo();
                I18NManagerShared.Register.RegisterFileLoadingInfo(info.FileKey, "bundle", info.FileBasePath, info.Default);
            }
        }

        private void ReloadData2()
        {
            I18NManagerShared.Manager.ClearData();
            I18NManagerShared.Register.ResetRegister();
            I18NManagerShared.Manager.LoadDataFromSettings(m_I18NSettings);
            UpdateSelectViews();
        }

        private void UpdateSelectViews()
        {
            //LangName
            var langNames = I18NManagerShared.Register.LangNames;
            m_DropdownLang.ClearOptions();
            var langList = new List<string>() {$"default({I18NManagerShared.Register.DefaultLang})"};
            foreach (var langName in langNames)
            {
                langList.Add(langName);
            }

            m_DropdownLang.AddOptions(langList);
            m_DropdownLang.value = 0;

            //FileKey
            var fileKeys = I18NManagerShared.Register.FileKeys;
            m_DropdownFileKey.ClearOptions();
            var fileKeyList = new List<string>() {$"default({I18NManagerShared.Register.DefaultFileKey})"};
            foreach (var fileKey in fileKeys)
            {
                fileKeyList.Add(fileKey);
            }

            m_DropdownFileKey.AddOptions(fileKeyList);
            m_DropdownFileKey.value = 0;
        }

        private readonly StringBuilder m_Sb = new StringBuilder();

        public void OnClickTestId()
        {
            m_Sb.Clear();
            var fileKey = m_DropdownFileKey.options[m_DropdownFileKey.value].text.Trim();
            if (string.IsNullOrEmpty(fileKey) || fileKey.StartsWith("default"))
            {
                m_Sb.Append($"使用默认数据集[{I18NManagerShared.Register.DefaultFileKey}]\n");
                fileKey = I18NManagerShared.Register.DefaultFileKey;
            }
            else
            {
                m_Sb.Append($"使用数据集[{fileKey}]\n");
            }

            var lang = m_DropdownLang.options[m_DropdownLang.value].text.Trim();
            if (string.IsNullOrEmpty(lang) || lang.StartsWith("default"))
            {
                m_Sb.Append($"使用默认语言[{I18NManagerShared.Register.DefaultLang}]\n");
                lang = I18NManagerShared.Register.DefaultLang;
            }
            else
            {
                m_Sb.Append($"使用语言[{lang}]\n");
            }

            m_Sb.Append($"查询结果：\n");
            var id = m_InputFieldId.text.Trim();
            if (string.IsNullOrEmpty(id))
            {
                m_TextResult.text = "Id不能为空";
                return;
            }

            var value = I18NManagerShared.Manager.GetValue(id, fileKey, lang);
            m_Sb.Append(value);
            m_TextResult.text = m_Sb.ToString();
        }

        public void OnClickTestContext()
        {
            m_Sb.Clear();
            var fileKey = m_DropdownFileKey.options[m_DropdownFileKey.value].text.Trim();
            if (string.IsNullOrEmpty(fileKey) || fileKey.StartsWith("default"))
            {
                m_Sb.Append($"使用默认数据集[{I18NManagerShared.Register.DefaultFileKey}]\n");
                fileKey = I18NManagerShared.Register.DefaultFileKey;
            }
            else
            {
                m_Sb.Append($"使用数据集[{fileKey}]\n");
            }

            var lang = m_DropdownLang.options[m_DropdownLang.value].text.Trim();
            if (string.IsNullOrEmpty(lang) || lang.StartsWith("default"))
            {
                m_Sb.Append($"使用默认语言[{I18NManagerShared.Register.DefaultLang}]\n");
                lang = I18NManagerShared.Register.DefaultLang;
            }
            else
            {
                m_Sb.Append($"使用语言[{lang}]\n");
            }

            m_Sb.Append($"查询结果：\n");
            var content = m_InputFieldContext.text;
            if (string.IsNullOrEmpty(content))
            {
                m_TextResult.text = "内容为空";
                return;
            }

            var value = I18NManagerShared.Manager.GetContent(content, fileKey, lang);
            m_Sb.Append(value);
            m_TextResult.text = m_Sb.ToString();
        }
    }
}