﻿using System;
using JLGames.RocketDriver.CSharp.Event;
using UnityEngine;
using Object = UnityEngine.Object;

namespace JLGames.RocketDriver.Actions.ThreadEvent
{
    public class ThreadEventDispatcher : EventDispatcher, IThreadEventDispatcher
    {
        protected GameObject m_Proxy;
        protected bool m_SelfProxy = false;

        // IEventProxy

        public bool OnProxy => null != m_Proxy;

        public void OpenMainThreadProxy(GameObject carrier)
        {
            if (null == carrier)
            {
                throw new NullReferenceException();
            }

            m_Proxy = carrier;
            if (null == carrier.GetComponent<MonoEventProxy>())
            {
                carrier.AddComponent<MonoEventProxy>();
                m_SelfProxy = true;
            }
        }

        public void CloseMainThreadProxy()
        {
            InnerRemoveProxy();
        }

        public override void Dispose()
        {
            InnerRemoveProxy();
            base.Dispose();
        }

        protected override void DispatchData(EventData evd)
        {
            var group = m_Event2Group[evd.Type];
            if (!OnProxy)
            {
                group.Handle(evd);
                return;
            }

            ThreadEventRecords.RecordEvent(group, evd);
        }

        private void InnerRemoveProxy()
        {
            if (m_Proxy != null)
            {
                if (m_SelfProxy)
                {
                    Object.Destroy(m_Proxy.GetComponent<MonoEventProxy>());
                }

                m_Proxy = null;
            }
        }
    }
}