using SGModule.Common.Helper;
using UnityEngine;

namespace SGModule.Common.Base {
    public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour {
        private static T _instance;

        /// <summary>
        ///     初始化完成标记，有需要的地方可以使用
        /// </summary>
        protected static bool IsInitComplete;

        // 存储所有单例的父对象
        private static GameObject _singletonParent;

        public static T Instance {
            get {
                if (_instance == null) {
                    // 尝试找到已存在的实例
                    _instance = FindObjectOfType<T>();

                    // 如果没有找到，则创建一个新的实例
                    if (_instance == null) {
                        // 确保所有单例对象放到同一个父对象下
                        if (_singletonParent == null) {
                            _singletonParent = GameObject.Find("Singletons") ?? new GameObject("Singletons");
                            DontDestroyOnLoad(_singletonParent); // 不在场景切换时销毁
                        }

                        var singletonObject = new GameObject(typeof(T).Name);
                        singletonObject.transform.SetParent(_singletonParent.transform); // 设置父对象
                        _instance = singletonObject.AddComponent<T>();
                    }
                }

                return _instance;
            }
        }

        // 确保在场景中只存在一个实例
        protected virtual void Awake() {
            if (_instance == null) {
                _instance = this as T;
            }
            else if (_instance != this) {
                Log.Common.Warning($"An instance of {typeof(T)} already exists! Destroying this instance.");
                Destroy(gameObject); // 如果有其他实例，销毁当前对象
            }
        }

        protected virtual void OnDestroy() {
            if (_instance == this) {
                _instance = null; // 清除引用
            }
        }
    }
}
