﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//UIManager不用继承于Monobehaviour，里面都是静态方法
public class UIManager
{
    //Layer
	public enum Layer{
		Panel,
		Tip,
	}
	//层级列表
	private static Dictionary<Layer, Transform> layers = new Dictionary<Layer, Transform>();
	//面板列表
	public static Dictionary<string, WindowBase> panels = new Dictionary<string, WindowBase>();
	//结构
	public static Transform canvas;
	//初始化
	public static void Init(){
		canvas = GameObject.Find("Canvas").transform;
		Transform panel = canvas.Find("Panel");
		Transform tip = canvas.Find("Tip");
		layers.Add(Layer.Panel, panel);
		layers.Add(Layer.Tip, tip);
	}

	//打开面板
	public static void Open<T>(params object[] para) where T:WindowBase{
		//已经打开
		string name = typeof(T).ToString();
		if (panels.ContainsKey(name)){
			return;
		}
		//组件
		WindowBase panel = canvas.gameObject.AddComponent<T>();
		panel.OnInit();
		panel.Init();
		//父容器
		Transform layer = layers[panel.layer];
		panel.skin.transform.SetParent(layer, false);
		//列表
		panels.Add(name, panel);
		//OnShow
		panel.OnShow(para);
	}

	//关闭面板
	public static void Close(string name){
		WindowBase panel = panels[name];
		//没有打开
		if (panel == null){
			return;
		}
		//OnClose
		panel.OnClose();
		//列表
		panels.Remove(name);
		//销毁
		GameObject.Destroy(panel.skin);
		Component.Destroy(panel);
	}

    //关闭所有 
    //在跳转场景时候删除了所有ui所以要closeall，为了防止再次进入该场景时候字典中重复添加。但是如果用的是dontdestroyonload就不需要了
	public static void CloseAll()
	{
		foreach(var i in panels)
		{
			WindowBase panel = i.Value;
			//没有打开
			if (panel == null){
				return;
			}
			panel.OnClose();
			//销毁
			GameObject.Destroy(panel.skin);
			Component.Destroy(panel);
		}
		panels.Clear();
		layers.Clear();
	}
}
