using System.Diagnostics;
using System.Threading;
using Microsoft.AspNet.SignalR.Infrastructure;

namespace NzbDrone.Api.SignalR
{
    public class NoOpPerformanceCounterManager : IPerformanceCounterManager
    {
        private static readonly IPerformanceCounter noOpCounter = new NoOpPerformanceCounter();

        public void Initialize(string instanceName, CancellationToken hostShutdownToken)
        {

        }

        public IPerformanceCounter LoadCounter(string categoryName, string counterName, string instanceName, bool isReadOnly)
        {
            return noOpCounter;
        }

        public IPerformanceCounter ConnectionsConnected { get { return noOpCounter; } }
        public IPerformanceCounter ConnectionsReconnected { get { return noOpCounter; } }
        public IPerformanceCounter ConnectionsDisconnected { get { return noOpCounter; } }
        public IPerformanceCounter ConnectionsCurrent { get { return noOpCounter; } }
        public IPerformanceCounter ConnectionMessagesReceivedTotal { get { return noOpCounter; } }
        public IPerformanceCounter ConnectionMessagesSentTotal { get { return noOpCounter; } }
        public IPerformanceCounter ConnectionMessagesReceivedPerSec { get { return noOpCounter; } }
        public IPerformanceCounter ConnectionMessagesSentPerSec { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusMessagesReceivedTotal { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusMessagesReceivedPerSec { get { return noOpCounter; } }
        public IPerformanceCounter ScaleoutMessageBusMessagesReceivedPerSec { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusMessagesPublishedTotal { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusMessagesPublishedPerSec { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusSubscribersCurrent { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusSubscribersTotal { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusSubscribersPerSec { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusAllocatedWorkers { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusBusyWorkers { get { return noOpCounter; } }
        public IPerformanceCounter MessageBusTopicsCurrent { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsAllTotal { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsAllPerSec { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsHubResolutionTotal { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsHubResolutionPerSec { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsHubInvocationTotal { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsHubInvocationPerSec { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsTransportTotal { get { return noOpCounter; } }
        public IPerformanceCounter ErrorsTransportPerSec { get { return noOpCounter; } }
        public IPerformanceCounter ScaleoutStreamCountTotal { get { return noOpCounter; } }
        public IPerformanceCounter ScaleoutStreamCountOpen { get { return noOpCounter; } }
        public IPerformanceCounter ScaleoutStreamCountBuffering { get { return noOpCounter; } }
        public IPerformanceCounter ScaleoutErrorsTotal { get { return noOpCounter; } }
        public IPerformanceCounter ScaleoutErrorsPerSec { get { return noOpCounter; } }
        public IPerformanceCounter ScaleoutSendQueueLength { get { return noOpCounter; } }
    }

    public class NoOpPerformanceCounter : IPerformanceCounter
    {
        public string CounterName
        {
            get
            {
                return this.GetType().Name;
            }
        }

        public long RawValue
        {
            get
            {
                return 0L;
            }
            set
            {
            }
        }

        public long Decrement()
        {
            return 0L;
        }

        public long Increment()
        {
            return 0L;
        }

        public long IncrementBy(long value)
        {
            return 0L;
        }

        public void Close()
        {
        }

        public void RemoveInstance()
        {
        }

        public CounterSample NextSample()
        {
            return CounterSample.Empty;
        }
    }
}