using System.Collections.Generic;
using UnityEngine;

namespace IGP.UnitySDK.Core
{
    /// <summary>
    /// RTT (Round-Trip Time) 统计信息
    /// 用于测量和监控网络延迟
    /// </summary>
    public class IGPRTTStats
    {
        private readonly List<float> samples = new List<float>();
        private const int MaxSamples = 100; // 保留最近100个样本

        // ✅ 添加累计和，用于 O(1) 平均值计算
        private float cumulativeSum = 0f;

        /// <summary>
        /// 最小RTT（秒）
        /// </summary>
        public float MinRTT { get; private set; } = float.MaxValue;

        /// <summary>
        /// 最大RTT（秒）
        /// </summary>
        public float MaxRTT { get; private set; } = 0f;

        /// <summary>
        /// 平均RTT（秒）
        /// </summary>
        public float AvgRTT { get; private set; } = 0f;

        /// <summary>
        /// 最后一次RTT（秒）
        /// </summary>
        public float LastRTT { get; private set; } = 0f;

        /// <summary>
        /// 样本数量
        /// </summary>
        public int SampleCount => samples.Count;

        /// <summary>
        /// 添加RTT样本
        /// </summary>
        /// <param name="rtt">RTT值（秒）</param>
        public void AddSample(float rtt)
        {
            LastRTT = rtt;
            MinRTT = Mathf.Min(MinRTT, rtt);
            MaxRTT = Mathf.Max(MaxRTT, rtt);

            // ✅ 增量更新：添加新样本
            samples.Add(rtt);
            cumulativeSum += rtt;

            // 移除旧样本时减去对应值
            if (samples.Count > MaxSamples)
            {
                var removed = samples[0];
                cumulativeSum -= removed;  // ✅ 减去移除的值
                samples.RemoveAt(0);
            }

            // ✅ O(1) 计算平均值
            AvgRTT = cumulativeSum / samples.Count;
        }

        /// <summary>
        /// 重置所有统计信息
        /// </summary>
        public void Reset()
        {
            samples.Clear();
            cumulativeSum = 0f;  // ✅ 重置累计和
            MinRTT = float.MaxValue;
            MaxRTT = 0f;
            AvgRTT = 0f;
            LastRTT = 0f;
        }
        
        /// <summary>
        /// 获取统计信息摘要
        /// </summary>
        /// <returns>(min, max, avg, last, count)</returns>
        public (float min, float max, float avg, float last, int count) GetStats()
        {
            return (MinRTT, MaxRTT, AvgRTT, LastRTT, SampleCount);
        }
        
        /// <summary>
        /// 获取网络质量评级
        /// </summary>
        /// <returns>优秀/良好/一般/较差/很差</returns>
        public string GetQuality()
        {
            float avgMs = AvgRTT * 1000f;
            
            if (avgMs < 20f) return "优秀";
            if (avgMs < 50f) return "良好";
            if (avgMs < 100f) return "一般";
            if (avgMs < 200f) return "较差";
            return "很差";
        }
        
        /// <summary>
        /// 获取质量颜色
        /// </summary>
        /// <returns>Unity Color</returns>
        public Color GetQualityColor()
        {
            float avgMs = AvgRTT * 1000f;
            
            if (avgMs < 20f) return Color.green;        // 优秀
            if (avgMs < 50f) return Color.yellow;       // 良好
            if (avgMs < 100f) return new Color(1f, 0.5f, 0f); // 一般（橙色）
            if (avgMs < 200f) return new Color(1f, 0.3f, 0f); // 较差（深橙）
            return Color.red;                            // 很差
        }
        
        /// <summary>
        /// 转换为字符串（用于日志）
        /// </summary>
        public override string ToString()
        {
            if (SampleCount == 0)
            {
                return "RTT: No samples";
            }

            return $"RTT: last={LastRTT*1000:F1}ms, avg={AvgRTT*1000:F1}ms, " +
                   $"min={MinRTT*1000:F1}ms, max={MaxRTT*1000:F1}ms, samples={SampleCount}";
        }
    }
}
