﻿using System.Collections.Generic;
using JLGames.RocketDriver.Actions.Loaderx;
using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.CSharp.Event;
using JLGames.RocketDriver.Games.PanelManager;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Samples.PanelDemo
{
    public class PanelDemo : MonoBehaviour
    {
        [SerializeField] private GameObject m_Control;

        [SerializeField] private InputField m_ShowPanelId;
        [SerializeField] private Dropdown m_PanelList;
        [SerializeField] private InputField m_ContainerId;

        [SerializeField] private InputField m_ClosePanelId;
        [SerializeField] private InputField m_CloseInstanceId;

        private void Start()
        {
            InitLoader();
        }

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

        private void OnVersionInited(AssetBundleManifest asset, bool suc)
        {
            DebugUtil.Log("OnVersionInited:", suc);
            if (suc)
            {
                ShowRootView();
                UpdatePanelList();
            }
        }

        private void ShowRootView()
        {
            m_Control.SetActive(true);
        }

        private void UpdatePanelList()
        {
            var infos = PanelManagerShared.Manager.Register.GetPanelInfos();
            var list = new List<string>();
            foreach (var info in infos)
            {
                list.Add(info.Id);
            }

            m_PanelList.AddOptions(list);
            var defaultPanelId = m_ShowPanelId.text.Trim();
            var index = list.FindIndex(s => defaultPanelId == s);
            if (index == -1)
            {
                index = 0;
            }

            m_PanelList.value = index;
        }

        public void OnDrowdownChanged(int index)
        {
            m_ShowPanelId.text = m_PanelList.options[index].text;
        }

        public void OnClickShow()
        {
            var panelId = m_ShowPanelId.text;
            var containerId = m_ContainerId.text;
            PanelManagerShared.Manager.ShowPanel(panelId, containerId);
        }

        public void OnClickClose()
        {
            var panelId = m_ClosePanelId.text;
            PanelManagerShared.Manager.CloseLastPanel(panelId);
        }

        public void OnClickCloseInstance()
        {
            var instanceId = m_CloseInstanceId.text;
            PanelManagerShared.Manager.CloseInstacnePanel(instanceId);
        }

        public void OnClickPrint()
        {
            var manager = PanelManagerShared.Manager;
            DebugUtil.Log("Registry:", manager.Register);
        }

        private void OnEnable()
        {
            var manager = PanelManagerShared.Manager;
            if (null != manager)
            {
                manager.AddEventListener(PanelEvents.EventPanelAdd, OnPanelAdd);
                manager.AddEventListener(PanelEvents.EventPanelAdded, OnPanelAdded);
                manager.AddEventListener(PanelEvents.EventPanelRemove, OnPanelRemove);
                manager.AddEventListener(PanelEvents.EventPanelRemoved, OnPanelRemoved);
                manager.AddEventListener(PanelEvents.EventPanelAllRemoved, OnPanelAllRemoved);
            }
        }

        private void OnDisable()
        {
            var manager = PanelManagerShared.Manager;
            if (null != manager)
            {
                manager.RemoveEventListener(PanelEvents.EventPanelAllRemoved, OnPanelAllRemoved);
                manager.RemoveEventListener(PanelEvents.EventPanelRemoved, OnPanelRemoved);
                manager.RemoveEventListener(PanelEvents.EventPanelRemove, OnPanelRemove);
                manager.RemoveEventListener(PanelEvents.EventPanelAdded, OnPanelAdded);
                manager.RemoveEventListener(PanelEvents.EventPanelAdd, OnPanelAdd);
            }
        }

        private void OnPanelAdd(EventData evd)
        {
            var info = evd.Data as IPanelInfo;
            DebugUtil.Log("OnPanelAdd:", info);
        }

        private void OnPanelAdded(EventData evd)
        {
            var info = evd.Data as IPanelInfo;
            DebugUtil.Log("OnPanelAdded:", info);
        }

        private void OnPanelRemove(EventData evd)
        {
            var info = evd.Data as IPanelInfo;
            DebugUtil.Log("OnPanelRemove:", info);
        }

        private void OnPanelRemoved(EventData evd)
        {
            var info = evd.Data as IPanelInfo;
            DebugUtil.Log("OnPanelRemoved:", info);
        }

        private void OnPanelAllRemoved(EventData evd)
        {
            DebugUtil.Log("OnPanelAllRemoved!");
        }
    }
}