/*
 *Copyright(C) 2023 by Chief All rights reserved.
 *Unity版本：2023.2.5f1c1 
 *作者:Chief  
 *创建日期: 2024-01-19 
 *模块说明：通用单例模块
 *版本: 1.0
*/

using UnityEngine;

namespace Aster
{
    /// <summary>
    /// 限制单例；
    /// 全局存续；
    /// 其特点是不会自动创建，需要手动统一创建；
    /// 如果放在场景里面，会自动赋值；
    /// </summary>
    public class LimitGlobalMonoSingleton<T> : MonoBehaviour where T : LimitGlobalMonoSingleton<T>
    {

        private static T Instance;

        public static T Get
        {
            get
            {
                if (Instance == null)
                {
                    if (Application.isPlaying)
                        //没有单例，弹出警告提示，不自动创建；
                        Logger.LogError($" 单例[{typeof(T)}]尚未创建！ ");
                }
                return Instance;
            }
        }

        public static bool Exist { get { return Instance != null; } }

        /// <summary>
        /// 外部调用，创建单例的方法；
        /// </summary>
        public static T Create()
        {
            if (Instance != null)
                return Instance;

            var obj = new GameObject($"[Global] {typeof(T).ToString()}");
            Instance = obj.AddComponent<T>();
            DontDestroyOnLoad(obj);
            return Instance;
        }

        public static void Release()
        {
            if (!Exist)
                return;
            Destroy(Instance.gameObject);
        }

        private void Awake()
        {
            if (Instance != null)
            {
                Logger.LogError("重复的单例创建：" + gameObject);
                if (Instance != this)
                    Destroy(this);
                return;
            }

            Instance = this as T;
            Logger.Log($"限制全局单例：{name} Awake !");
            Do_Init();
        }

        /// <summary>
        /// 初始化；
        /// </summary>
        protected virtual void Do_Init() { }

        private void OnDestroy() { Do_Release(); }

        /// <summary>
        /// 销毁时调用
        /// </summary>
        protected virtual void Do_Release() { }

    }
}