﻿using System;
using JLGames.RocketDriver.Actions.Extensions;
using JLGames.RocketDriver.Actions.i18n;
using JLGames.RocketDriver.Actions.Utils;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine.UIElements;

namespace JLGames.RocketDriver.Editor.Windows.GettingStarted
{
    internal class FooterElement
    {
        private readonly Toggle m_ToggleShow;
        private readonly Label m_LangTitle;
        private readonly ToolbarMenu m_LangMenu;
        private const int MenuSize = 2;

        public Toggle ToggleShow => m_ToggleShow;
        public Label LangTitle => m_LangTitle;
        public ToolbarMenu LangMenu => m_LangMenu;

        private string m_LangValue;
        private II18NManager m_Ii18NManager;
        private Action m_CallbackAction;

        public FooterElement(VisualElement footerNode)
        {
            m_ToggleShow = footerNode.GetElementByName<Toggle>("show");
            var notShow = EditorPrefs.GetBool(WinGettingStartedConst.EditorKeyNotShow);
            m_ToggleShow.value = !notShow;

            m_LangTitle = footerNode.GetElementByChain<Label>("lang/title");
            m_LangMenu = footerNode.GetElementByChain<ToolbarMenu>("lang/menu");
        }

        public void UpdateValues(II18NManager i18NManager)
        {
            if (null == m_ToggleShow || null == i18NManager) return;

            m_Ii18NManager = i18NManager;
            var showTitle = (Label) m_ToggleShow.contentContainer[0];
            showTitle.text = i18NManager.GetValue("start.footer.show.title");

            m_LangTitle.text = i18NManager.GetValue("start.footer.lang.title");

            m_LangValue = EditorPrefs.GetString(WinGettingStartedConst.EditorKeyLang);
            for (var index = 0; index < MenuSize; index++)
            {
                var key = $"start.footer.lang.items.{index}";
                var title = i18NManager.GetValue($"{key}.title");
                var value = i18NManager.GetValue($"{key}.value");
                m_LangMenu.menu.AppendAction(title, action => { OnLangChanged(title, value); });
                if (m_LangValue == value) m_LangMenu.text = title;
            }
        }

        private void OnLangChanged(string title, string value)
        {
            if (m_LangValue == value) return;
            m_LangValue = value;

            EditorPrefs.SetString(WinGettingStartedConst.EditorKeyLang, value);
            m_Ii18NManager.Register.SetDefaultLang(value);
            m_CallbackAction?.Invoke();
        }

        public void RegisterButtonsCallback(Action action)
        {
            m_CallbackAction = action;
        }

        public void UnregisterButtonsCallback()
        {
            m_CallbackAction = null;
        }
    }
}