
using System;

namespace Plugins.JNGame.Sync.Frame.Entity
{
    public class JNTime
    {

        private JNSyncFrame _sync;

        public static JNTime Time = new JNTime();

        /// <summary>
        /// 在Unity中，Time.time是一个非常有用的属性，它表示从游戏开始运行到现在的时间，单位是秒。它常常被用来作为游戏内时间或者帧时间的参考。
        /// </summary>
        public float time => _sync == null ? UnityEngine.Time.time : (this.deltaTime * _sync.NLocalRunFrame);
        
        /// <summary>
        /// 在Unity中，Time.deltaTime是一个表示上一帧所花费时间的属性，单位是秒。它用于在游戏运行时提供稳定的时间测量，不受帧率变化的影响
        /// </summary>
        public float deltaTime => _sync == null ? UnityEngine.Time.deltaTime : ((float)_sync.NSyncTime / _sync.NDivideFrame) / 1000;
        
        /// <summary>
        /// Time.fixedDeltaTime是一个在Unity中表示以秒为单位的固定时间间隔的属性，通常用于物理计算和其他需要固定帧率更新的场景。它与Time.deltaTime不同，因为Time.fixedDeltaTime可以自行赋值，并且用于固定帧率更新（如FixedUpdate()函数）。
        /// </summary>
        public float fixedDeltaTime => _sync == null ? UnityEngine.Time.fixedDeltaTime : ((float)_sync.NSyncTime / _sync.NDivideFrame) / 1000;
        
        /// <summary>
        /// Time.frameCount 表示已经渲染的总帧数。这个属性通常用于性能测试，例如，你可以使用它来检查游戏是否在每一帧都进行了必要的渲染工作，或者是否在某些帧上出现了渲染瓶颈。
        /// </summary>
        public int frameCount => _sync == null ? UnityEngine.Time.frameCount : _sync.NLocalRunFrame;
        
        
        /// <summary>
        /// Time.realtimeSinceStartup是Unity中表示自游戏启动以来经过的实时时间（以秒为单位）的属性。这个时间不受Time.timeScale的影响，即使游戏暂停或慢动作，它的值也会持续增加，因为它是独立于游戏时间的。
        /// </summary>
        public float realtimeSinceStartup => _sync == null ? UnityEngine.Time.realtimeSinceStartup : (this.time);
        
        /// <summary>
        /// Time.unscaledDeltaTime 是 Unity 中的一个属性，表示上一帧所花费的时间，单位是秒。与 Time.deltaTime 不同，Time.unscaledDeltaTime 是未经过时间缩放的，也就是说它不受 Time.timeScale 的影响。
        /// </summary>
        public float unscaledDeltaTime => _sync == null ? UnityEngine.Time.unscaledDeltaTime : ((float)_sync.NSyncTime / _sync.NDivideFrame) / 1000;
        
        public float smoothDeltaTime => _sync == null ? UnityEngine.Time.smoothDeltaTime : ((float)_sync.NSyncTime / _sync.NDivideFrame) / 1000;
        
        /// <summary>
        /// Time.timeSinceLevelLoad是一个表示从当前场景开始到现在所经过的时间的属性，单位是秒。这个属性通常用于计算从加载关卡开始到当前帧的时间，并且会随着游戏的暂停而停止计算
        /// </summary>
        public float timeSinceLevelLoad => _sync == null ? UnityEngine.Time.timeSinceLevelLoad : ((float)_sync.NSyncTime / _sync.NDivideFrame) / 1000;


        /// <summary>
        /// System.DateTime.UtcNow.Ticks
        /// </summary>
        public long Ticks => _sync == null ? DateTime.UtcNow.Ticks : _sync.NSyncTime * _sync.NLocalRunFrame;
        
        public JNTime(JNSyncFrame sync)
        {
            this._sync = sync;
            Time = this;
        }
        public JNTime()
        {
            Time = this;
        }
        
    }
}