﻿using System;
using UnityEngine;

namespace JLGames.RocketDriver.Games.PanelManager
{
    public interface IPanelRegister
    {
        /// <summary>
        /// Clear register
        /// 清空注册表
        /// </summary>
        void ClearRegister();

        /// <summary>
        /// Register panel info
        /// 注册面板信息
        /// </summary>
        /// <param name="info"></param>
        void RegisterPanelInfo(IPanelInfo info);

        /// <summary>
        /// Register panel info
        /// 注册面板信息
        /// </summary>
        /// <param name="id"></param>
        /// <param name="bundleName"></param>
        /// <param name="assetPath"></param>
        void RegisterPanelInfo(string id, string bundleName, string assetPath);

        /// <summary>
        /// Register panel info
        /// 注册面板信息
        /// </summary>
        /// <param name="id"></param>
        /// <param name="settings"></param>
        /// <param name="maxDisplayNum"></param>
        /// <param name="extendType">业务扩展用面板类型</param>
        void RegisterPanelInfo(string id, IPanelSettings settings, int maxDisplayNum, int extendType);

        /// <summary>
        /// Check panel info exist or not
        /// 是否包含面板
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        bool ContainsPanelInfo(string id);

        /// <summary>
        /// Get panel info
        /// 取面板信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        IPanelInfo GetPanelInfo(string id);

        /// <summary>
        /// Get panel infos
        /// 取面板信息
        /// </summary>
        /// <param name="match"></param>
        /// <returns></returns>
        IPanelInfo[] GetPanelInfos(Predicate<IPanelInfo> match = null);

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

        /// <summary>
        /// Register panel container layer
        /// 注册面板容器
        /// </summary>
        /// <param name="layerName"></param>
        /// <param name="layer"></param>
        /// <param name="default"></param>
        void RegisterLayer(string layerName, Transform layer, bool @default = false);

        /// <summary>
        /// Check panel container layer exist or not
        /// 是否包含面板容器
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        bool ContainsLayer(string name);

        /// <summary>
        /// Get panel container layer instance
        /// 取面板容器
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        Transform GetPanelLayer(string name);

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

        /// <summary>
        /// Register background meta object
        /// 注册背景元预制件
        /// </summary>
        /// <param name="key"></param>
        /// <param name="origin"></param>
        /// <param name="script"></param>
        void RegisterBackground(string key, GameObject origin, string script);

        /// <summary>
        /// Check background object exist or not
        /// 是否包含面板容器
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        bool ContainsBackground(string key);

        /// <summary>
        /// Get background registered info.
        /// 取面板容器
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        BackgroundInfo GetBackground(string key);

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

        /// <summary>
        /// Register panel instance meta container
        /// 注册实例容器
        /// </summary>
        /// <param name="container"></param>
        void RegisterPanelContainer(GameObject container);

        /// <summary>
        /// Get the meta container instance
        /// 取注册的实例容器
        /// </summary>
        GameObject PanelContainerOrigin { get; }

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

        /// <summary>
        /// Register RuntimeAnimatorController
        /// 注册动画控制器
        /// </summary>
        /// <param name="key"></param>
        /// <param name="animator"></param>
        void RegisterAnimator(string key, RuntimeAnimatorController animator);

        /// <summary>
        /// Check animator exist or not
        /// 是否包含动画控制器
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        bool ContainsAnimator(string key);

        /// <summary>
        /// Get animator
        /// 取动画控制器
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        RuntimeAnimatorController GetAnimator(string key);
    }
}