using System;
namespace Mirror
{
    /// Profiling statistics for tool to subscribe to (profiler etc.)
    public static class NetworkDiagnostics
    {
        /// Describes an outgoing message
        public readonly struct MessageInfo
        {
            /// The message being sent
            public readonly NetworkMessage message;
            /// channel through which the message was sent
            public readonly int channel;
            /// how big was the message (does not include transport headers)
            public readonly int bytes;
            /// How many connections was the message sent to.
            public readonly int count;
            internal MessageInfo(NetworkMessage message, int channel, int bytes, int count)
            {
                this.message = message;
                this.channel = channel;
                this.bytes = bytes;
                this.count = count;
            }
        }
        /// Event for when Mirror sends a message. Can be subscribed to.
        public static event Action OutMessageEvent;
        internal static void OnSend(T message, int channel, int bytes, int count)
            where T : struct, NetworkMessage
        {
            if (count > 0 && OutMessageEvent != null)
            {
                MessageInfo outMessage = new MessageInfo(message, channel, bytes, count);
                OutMessageEvent?.Invoke(outMessage);
            }
        }
        /// Event for when Mirror receives a message. Can be subscribed to.
        public static event Action InMessageEvent;
        internal static void OnReceive(T message, int channel, int bytes)
            where T : struct, NetworkMessage
        {
            if (InMessageEvent != null)
            {
                MessageInfo inMessage = new MessageInfo(message, channel, bytes, 1);
                InMessageEvent?.Invoke(inMessage);
            }
        }
    }
}