﻿using JLGames.RocketDriver.CSharp.Event;
using JLGames.RocketDriver.CSharp.Service;
using UnityEngine;

namespace JLGames.RocketDriver.Samples.ServiceDemo
{
    public class ServiceNode : MonoBehaviour
    {
        [SerializeField] private ServiceNameNode m_NameNode;
        [SerializeField] private ServiceStateNode m_InjectNode;
        [SerializeField] private ServiceStateNode m_AwakeNode;
        [SerializeField] private ServiceStateNode m_InitNode;
        [SerializeField] private ServiceStateNode m_InitDataNode;

        private ServiceInfo m_ServiceInfo;

        private void OnDestroy()
        {
            RemoveServiceListeners();
        }

        public void InitNode(ServiceInfo info)
        {
            m_ServiceInfo = info;
            m_NameNode.SetName(info.ServiceName);
            AddServiceListeners();
        }

        private void AddServiceListeners()
        {
            var manager = ServiceManager.Shared;
            manager.AddEventListener(ServiceEvents.OnServiceInjected, OnServiceInjected);
            manager.AddEventListener(ServiceEvents.OnServiceAwaked, OnServiceAwaked);
            manager.AddEventListener(ServiceEvents.OnServiceInitStart, OnServiceInitStart);
            manager.AddEventListener(ServiceEvents.OnServiceInited, OnServiceInited);
            manager.AddEventListener(ServiceEvents.OnServiceDataInitStart, OnServiceDataInitStart);
            manager.AddEventListener(ServiceEvents.OnServiceDataInited, OnServiceDataInited);
        }

        private void RemoveServiceListeners()
        {
            var manager = ServiceManager.Shared;
            manager.RemoveEventListener(ServiceEvents.OnServiceDataInited, OnServiceDataInited);
            manager.RemoveEventListener(ServiceEvents.OnServiceDataInitStart, OnServiceDataInitStart);
            manager.RemoveEventListener(ServiceEvents.OnServiceInited, OnServiceInited);
            manager.RemoveEventListener(ServiceEvents.OnServiceInitStart, OnServiceInitStart);
            manager.RemoveEventListener(ServiceEvents.OnServiceAwaked, OnServiceAwaked);
            manager.RemoveEventListener(ServiceEvents.OnServiceInjected, OnServiceInjected);
        }

        private void OnServiceDataInitStart(EventData evd)
        {
            var data = (ServiceResultData) evd.Data;
            if (data.ServiceName != m_ServiceInfo.ServiceName) return;
            if (data.Succ)
                m_InitDataNode.SetEnable();
            else
                m_InitDataNode.SetDisable();
        }


        private void OnServiceDataInited(EventData evd)
        {
            var serviceName = evd.Data as string;
            if (serviceName != m_ServiceInfo.ServiceName) return;
            m_InitDataNode.SetFinish();
        }

        private void OnServiceInitStart(EventData evd)
        {
            var data = (ServiceResultData) evd.Data;
            if (data.ServiceName != m_ServiceInfo.ServiceName) return;
            if (data.Succ)
                m_InitNode.SetEnable();
            else
                m_InitNode.SetDisable();
        }

        private void OnServiceInited(EventData evd)
        {
            var serviceName = evd.Data as string;
            if (serviceName != m_ServiceInfo.ServiceName) return;
            m_InitNode.SetFinish();
        }

        private void OnServiceAwaked(EventData evd)
        {
            var data = (ServiceResultData) evd.Data;
            if (data.ServiceName != m_ServiceInfo.ServiceName) return;
            if (data.Succ)
            {
                m_AwakeNode.SetEnable();
                m_AwakeNode.SetFinish();
            }
            else
                m_AwakeNode.SetDisable();
        }

        private void OnServiceInjected(EventData evd)
        {
            var data = (ServiceResultData) evd.Data;
            if (data.ServiceName != m_ServiceInfo.ServiceName) return;
            if (data.Succ)
            {
                m_InjectNode.SetEnable();
                m_InjectNode.SetFinish();
            }
            else
                m_InjectNode.SetDisable();
        }
    }
}