using System;
using UnityEngine;

/// <summary>
/// 屏幕适配管理类
/// </summary>
public class AdaptationManager : MonoBehaviour
{
    public enum ResizeType
    {
        OnStart, //只在Start方法中适配一次

        /*
         * 放在Start方法中而不是Awake方法中，
         * 因为Awake方法中进行初始化操作
         * 此时进行适配很有可能数据还没初始化完成
         */

        OnEnable, //脚本启用时适配一次

        OnScreenChange, //屏幕改变时就适配

        /*
         * OnScreenChange
         *屏幕改变时就适配
         *这里只是便于测试，或者执行一些特殊逻辑，
         * 一般情况下，在Start方法中执行一次就可以了，
         * 因为屏幕的大小是不会在运行时改变的，除非横屏竖屏的情况都进行适配)
         */
    }

    //创建一个单例，方便其他脚本访问
    private static AdaptationManager instance;

    public static AdaptationManager Instance
    {
        get
        {
            if (instance == null)
            {
                //这里直接创建一个物体挂载脚本，省去拖拽的步骤
                instance = new GameObject("AdaptationManager").AddComponent<AdaptationManager>();
                instance.Init();
                DontDestroyOnLoad(instance.gameObject);
            }

            return instance;
        }
    }

    public int defaultWidth = 720; //默认设计宽度
    public int defaultHeight = 1280; //默认设计高度

    public ResizeType resizeType = ResizeType.OnScreenChange; //何时执行适配，为方便测试先设置为OnScreenChange

    [HideInInspector] public float defaultRatio; //默认设计的宽高比
    [HideInInspector] public float actualRatio; //实际屏幕的宽高比
    [HideInInspector] public bool wideMode; //是否是横屏模式
    [HideInInspector] public Vector2 screenSize; //屏幕实际分辨率

    public Action onScreenResize; //屏幕适配时的回调

    private Vector2 tempSize; //临时变量,用于监听屏幕是否发生改变

    private void OnEnable()
    {
        if (resizeType == ResizeType.OnEnable)
        {
            RefreshData();
        }
    }

    private void Start()
    {
        if (resizeType == ResizeType.OnStart)
        {
            RefreshData();
        }
    }

    private void Update()
    {
        if (resizeType == ResizeType.OnScreenChange)
        {
            //屏幕大小改变时重新计算适配
            tempSize.Set(Screen.width, Screen.height);
            if (screenSize != tempSize)
            {
                screenSize = tempSize;
                RefreshData();
            }
        }
    }

    /// <summary>
    /// 初始化适配相关的数据
    /// </summary>
    private void Init()
    {
        defaultRatio = defaultWidth * 1.0f / defaultHeight;
        actualRatio = Screen.width * 1.0f / Screen.height;

        wideMode = actualRatio > 1; //宽如果大于高的话，那么就是横屏模式

        tempSize = new Vector2(Screen.width, Screen.height);
    }

    /// <summary>
    /// 刷新数据，调用回调
    /// </summary>
    private void RefreshData()
    {
        //刷新实际宽高比
        actualRatio = Screen.width * 1.0f / Screen.height;
        wideMode = actualRatio > 1;

        //调用适配回调
        onScreenResize?.Invoke();
    }

    private void OnDestroy()
    {
        instance = null;
    }
}
