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

public class UIManager : Singleton<UIManager>
{
    private GameObject m_UIRoot;
    private Dictionary<string, BaseUI> m_DicUI = new Dictionary<string, BaseUI>();
    private bool m_IsInit;
    public GameObject UIRoot
    {
        get
        {
            if (m_UIRoot == null)
            {
                m_UIRoot = GameObject.FindGameObjectWithTag("UIRoot_UGUI");
            }
            return m_UIRoot;
        }
    }

    public void Init()
    {
        if (m_IsInit)
        {
            return;
        }
        m_IsInit = true;
    }
    public void ShowUI(string uiName, Type type, object param = null)
    {
        if (null == UIRoot)
        {
            return;
        }

        BaseUI baseUI = null;
        m_DicUI.TryGetValue(uiName, out baseUI);
        if (null == baseUI)
        {
            UnityEngine.Object @object = ResMgr.Instance.Load("UI/" + uiName);
            GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(@object as GameObject);
            gameObject.SetActive(false);
            baseUI = (gameObject.AddComponent(type) as BaseUI);
            baseUI.UIName = uiName;
            baseUI.UIInit();
            baseUI.CacheTransform.SetParent(UIRoot.transform, false);
            m_DicUI[baseUI.UIName] = baseUI;
        }
        baseUI.Show(param);
    }

    public void ShowUI(string uiName, Type type, WarningUI.OnYesClick onYesClick, object param = null)
    {
        if (null == UIRoot)
        {
            return;
        }
        BaseUI baseUI = null;
        m_DicUI.TryGetValue(uiName, out baseUI);
        if (null == baseUI)
        {
            UnityEngine.Object @object = ResMgr.Instance.Load("UI/" + uiName);
            GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(@object as GameObject);
            gameObject.SetActive(false);
            baseUI = (gameObject.AddComponent(type) as BaseUI);
            baseUI.UIName = uiName;
            baseUI.UIInit();
            baseUI.CacheTransform.SetParent(UIRoot.transform, false);
            m_DicUI[baseUI.UIName] = baseUI;
        }
        baseUI.Show(onYesClick, param);
    }

    public void ShowUI(string uiName, Type type, WarningUI.OnYesClick onYesClick, WarningUI.OnNoClick onNoClick, object param = null)
    {
        if (null == UIRoot)
        {
            return;
        }
        BaseUI baseUI = null;
        m_DicUI.TryGetValue(uiName, out baseUI);
        if (null == baseUI)
        {
            UnityEngine.Object @object = ResMgr.Instance.Load("UI/" + uiName);
            GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(@object as GameObject);
            gameObject.SetActive(false);
            baseUI = (gameObject.AddComponent(type) as BaseUI);
            baseUI.UIName = uiName;
            baseUI.UIInit();
            baseUI.CacheTransform.SetParent(UIRoot.transform, false);
            m_DicUI[baseUI.UIName] = baseUI;
        }
        baseUI.Show(onYesClick, onNoClick, param);
    }
    public void HideUI(string uiName)
    {
        BaseUI baseUI = null;
        m_DicUI.TryGetValue(uiName, out baseUI);
        if (null != baseUI)
        {
            baseUI.Hide();
        }
    }
    public void DestroyUI(string uiName)
    {
        BaseUI baseUI = null;
        m_DicUI.TryGetValue(uiName, out baseUI);
        if (null != baseUI)
        {
            m_DicUI.Remove(baseUI.UIName);
            UnityEngine.Object.Destroy(baseUI.CacheGameObject);
        }
    }
    public bool IsUIOpen(string uiName)
    {
        BaseUI baseUI = null;
        m_DicUI.TryGetValue(uiName, out baseUI);
        return null != baseUI && baseUI.IsShow();
    }

    public BaseUI GetUI(string uiName)
    {
        BaseUI baseUI = null;
        m_DicUI.TryGetValue(uiName, out baseUI);
        if (null != baseUI)
        {
            return baseUI;
        }
        else
        {
            return null;
        }
    }

    public void ChangeCanvasPos()
    {
        if (API_GSXR_Slam.GSXR_Get_Head() != null)
        {
            m_UIRoot.transform.eulerAngles = new Vector3(0, API_GSXR_Slam.GSXR_Get_Head().eulerAngles.y, 0);
            m_UIRoot.transform.position = API_GSXR_Slam.GSXR_Get_Head().position + GameManager.Instance.Player.transform.forward + new Vector3(0, 0.3f, 0);
        }
    }

    public void ChangePos()
    {
        if (API_GSXR_Slam.GSXR_Get_Head() != null&&GameManager.Instance.Player.transform.position == API_GSXR_Slam.GSXR_Get_Head().position)
        {
            m_UIRoot.transform.eulerAngles = new Vector3(0, API_GSXR_Slam.GSXR_Get_Head().eulerAngles.y, 0);
           // Debug.Log(GameManager.Instance.Player.transform.position+" ##########  "+ API_GSXR_Slam.GSXR_Get_Head().transform.forward);
            m_UIRoot.transform.position = GameManager.Instance.Player.transform.forward + new Vector3(0, -0.2f, 0.2f);
        }
    }
}