﻿using System.Threading;
using JLGames.RocketDriver.Actions.ThreadEvent;
using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.CSharp.Event;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Samples.EventDemo
{
    public class EventDemo : MonoBehaviour
    {
        [SerializeField] private Text m_TextProxyName;
        [SerializeField] private InputField m_InputType;
        [SerializeField] private InputField m_InputWeight;
        [SerializeField] private InputField m_InputTimes;
        [SerializeField] private InputField m_InputTag;
        [SerializeField] private InputField m_InputValue;

        private readonly IThreadEventDispatcher m_Dispatcher = new ThreadEventDispatcher();

        private string EventType => m_InputType.text.Trim();
        private int EventWeight => int.Parse(m_InputWeight.text.Trim());
        private uint EventTimes => uint.Parse(m_InputTimes.text.Trim());

        private string EventTag
        {
            get
            {
                var text = m_InputTag.text.Trim();
                return string.IsNullOrEmpty(text) ? null : text;
            }
        }

        private string DispatchValue => m_InputValue.text.Trim();

        private void Start()
        {
            m_InputWeight.text = EventConst.DefaultWeight.ToString();
            m_InputTimes.text = "0";
            UpdateProxyName();
        }

        public void OnClickProxy()
        {
            if (m_Dispatcher.OnProxy)
                m_Dispatcher.CloseMainThreadProxy();
            else
                m_Dispatcher.OpenMainThreadProxy(gameObject);

            UpdateProxyName();
        }

        private void UpdateProxyName()
        {
            m_TextProxyName.text = m_Dispatcher.OnProxy ? "Disable Proxy" : "Enable Proxy";
        }

        public void OnClickAddEvent()
        {
            m_Dispatcher.AddEventListener(EventType, OnEvent, EventWeight, EventTimes, EventTag);
        }

        public void OnClickRemoveEvent()
        {
            m_Dispatcher.RemoveEventListener(EventType, OnEvent, EventTag);
        }

        public void OnClickOnceEvent()
        {
            m_Dispatcher.OnceEventListener(EventType, OnEvent, EventWeight, EventTag);
        }

        public void OnClickDispatchEvent()
        {
            if (!m_Dispatcher.OnProxy)
            {
                DoDispatch();
                return;
            }

            var thread = new Thread(DoDispatch);
            thread.Start();
        }

        private void DoDispatch()
        {
            m_Dispatcher.DispatchEvent(EventType, DispatchValue);
        }

        private void OnEvent(EventData evd)
        {
            var type = evd.Type;
            var data = evd.Data as string;
            DebugUtil.LogWarning($"EventDemo.OnEvent[Type={type}, Data={data}]");
        }

        private void OnOnceEvent(EventData evd)
        {
            var type = evd.Type;
            var data = evd.Data as string;
            DebugUtil.LogWarning($"EventDemo.OnOnceEvent[Type={type}, Data={data}]");
        }
    }
}