#if UNITY_EDITOR || DEVELOPMENT_BUILD
using FishNet.Managing.Logging;
using FishNet.Object;
using FishNet.Serializing;
using FishNet.Transporting;
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace FishNet.Managing.Debugging
{
    internal class ParseLogger
    {
        /// 
        /// Contains the last several non-split packets to arrive. This is used for debugging.
        /// 
        private Queue _incomingPacketIds = new Queue();
        /// 
        /// Maximum number of packets allowed to be queued.
        /// 
        private const int PACKET_COUNT = 5;
        /// 
        /// Resets data.
        /// 
        internal void Reset()
        {
            _incomingPacketIds.Clear();
        }
        /// 
        /// Adds a packet to data.
        /// 
        /// 
        internal void AddPacket(PacketId pId)
        {
            _incomingPacketIds.Enqueue(pId);
            if (_incomingPacketIds.Count > PACKET_COUNT)
                _incomingPacketIds.Dequeue();
        }
        /// 
        /// Prints current data.
        /// 
        internal void Print(NetworkManager nm)
        {
            if (nm == null)
                nm = InstanceFinder.NetworkManager;
            //Only log if a NM was found.
            if (nm != null)
            {
                StringBuilder sb = new StringBuilder();
                foreach (PacketId item in _incomingPacketIds)
                    sb.Insert(0, $"{item.ToString()}{Environment.NewLine}");
                NetworkObject lastNob = Reader.LastNetworkObject;
                string nobData = (lastNob == null) ? "Unset" : $"Id {lastNob.ObjectId} on gameObject {lastNob.name}";
                NetworkBehaviour lastNb = Reader.LastNetworkBehaviour;
                string nbData = (lastNb == null) ? "Unset" : lastNb.GetType().Name;
                nm.LogError($"The last {_incomingPacketIds.Count} packets to arrive are: {Environment.NewLine}{sb.ToString()}");
                nm.LogError($"The last parsed NetworkObject is {nobData}, and NetworkBehaviour {nbData}.");
            }
            Reset();
        }
    }
}
#endif