﻿using UnityEngine;

namespace JLGames.RocketDriver.Actions.Layer
{
    public interface ILayerManager
    {
        /// <summary>
        /// The root container corresponding to the layer
        /// 层对应的根容器
        /// </summary>
        Transform LayerRootContainer { get; }

        /// <summary>
        /// Set the root container
        /// 设置根容器
        /// </summary>
        void SetRootContainer(Transform root);

        /// <summary>
        /// Set meta prefab
        /// 记录原型Prefab
        /// </summary>
        void SetLayerPrefab(GameObject prefab);

        /// <summary>
        /// Initialize the layer structure
        /// 初始化层结构
        /// </summary>
        void InitLayers();

        /// <summary>
        /// Add new layer
        /// 增加新层
        /// </summary>
        Transform GenLayer(string layerName);

        /// <summary>
        /// Add new layer to index 
        /// 增加新层到指定层次
        /// </summary>
        Transform GenLayer(string layerName, int siblingIndex);

        /// <summary>
        /// 生成层
        /// </summary>
        /// <param name="layerNames"></param>
        /// <returns></returns>
        Transform[] GenLayers(string[] layerNames);

        /// <summary>
        /// Add new layers
        /// 增加多个层
        /// </summary>
        /// <param name="rootNameChain"></param>
        /// <param name="layerName"></param>
        /// <returns></returns>
        Transform GenLayerAt(string rootNameChain, string layerName);

        /// <summary>
        /// Add new layers to index
        /// 生成层到指定层次
        /// </summary>
        /// <param name="rootNameChain"></param>
        /// <param name="layerName"></param>
        /// <param name="siblingIndex"></param>
        /// <returns></returns>
        Transform GenLayerAt(string rootNameChain, string layerName, int siblingIndex);

        /// <summary>
        /// Generate layers into the specified container
        /// 生成层到指定容器中
        /// </summary>
        Transform GenLayerAt(Transform container, string layerName);

        /// <summary>
        /// Generate layers into the specified container， and set index
        /// 生成层到指定容器中，并指定层次
        /// </summary>
        /// <param name="container"></param>
        /// <param name="layerName"></param>
        /// <param name="siblingIndex"></param>
        /// <returns></returns>
        Transform GenLayerAt(Transform container, string layerName, int siblingIndex);

        /// <summary>
        /// Check exist
        /// 存在性检查
        /// </summary>
        bool ContainsLayer(string nameOrChain);

        /// <summary>
        /// Check exist
        /// 存在性检查
        /// </summary>
        bool ContainsLayer(Transform container, string nameOrChain);

        /// <summary>
        /// Get the layer.
        /// 查找容器
        /// </summary>
        /// <returns>The layer.</returns>
        /// <param name="nameOrChain">Layer name or chain.</param>
        /// <param name="useName"></param>
        Transform GetLayer(string nameOrChain, bool useName);

        /// <summary>
        /// Gets the layer.
        /// 查找容器
        /// </summary>
        /// <returns>The layer.</returns>
        /// <param name="root"></param>
        /// <param name="nameOrChain">Layer name or chain.</param>
        /// <param name="useName"></param>
        Transform GetLayer(Transform root, string nameOrChain, bool useName);
    }
}