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

namespace JLGames.RocketDriver.Games.PanelManager
{
    internal partial class PanelManager : EventDispatcher, IPanelManager
    {
        private bool m_ShowAfterFrame = true;
        private IPanelRegister m_Register;
        private IPanelLoaderAdapter m_Loader;
        private PanelList m_OpenList;
        private PanelList m_ClosingList;

        public void Init()
        {
            m_Register = new PanelRegister();
            m_Loader = new PanelLoader();
            m_OpenList = new PanelList();
            m_ClosingList = new PanelList();
        }

        public void SetShowMoment(bool showAfterFrame)
        {
            m_ShowAfterFrame = showAfterFrame;
        }

        public override void Dispose()
        {
            m_ClosingList?.Clear();
            m_ClosingList = null;
            m_OpenList?.Clear();
            m_OpenList = null;
            m_Loader = null;
            m_Register?.ClearRegister();
            m_Register = null;
            base.Dispose();
        }

        public bool ShowAfterFrame => m_ShowAfterFrame;

        public IPanelRegister Register => m_Register;

        public void SetRegister(IPanelRegister register)
        {
            m_Register = register;
        }

        public IPanelLoaderAdapter Loader => m_Loader;

        public void SetLoader(IPanelLoaderAdapter loader)
        {
            m_Loader = loader;
        }

        //---------------------------------

        public bool HasOpenedPanel => m_OpenList.Size > 0;

        public IPanelInfo GetPanelInfo(string panelId)
        {
            return m_Register.GetPanelInfo(panelId);
        }

        public bool CheckPanelOpen(string panelId)
        {
            return m_OpenList.ContainsPanel(panelId);
        }

        public IPanelInstance GetOpenedPanel(string panelId)
        {
            return m_OpenList.GetByPanelId(panelId);
        }

        public IPanelInstance GetOpenedPanel(GameObject view)
        {
            return m_OpenList.GetByView(view);
        }

        public IPanelInstance[] GetOpenedPanels()
        {
            if (null == m_OpenList || m_OpenList.Size == 0) return null;
            var rs = new IPanelInstance[m_OpenList.Size];
            for (var index = 0; index < m_OpenList.m_Panels.Count; index++)
            {
                rs[index] = m_OpenList.m_Panels[index];
            }

            return rs;
        }
    }
}