﻿/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace DotPulsar.Internal
{
#if NETSTANDARD2_0
    public sealed class DotPulsarEventSource
    {
        public static readonly DotPulsarEventSource Log = new();

        public void ClientCreated() { }

        public void ClientDisposed() { }

        public void ConnectionCreated() { }

        public void ConnectionDisposed() { }

        public void ConsumerCreated() { }

        public void ConsumerDisposed() { }

        public void ProducerCreated() { }

        public void ProducerDisposed() { }

        public void ReaderCreated() { }

        public void ReaderDisposed() { }
    }

#else
    using System.Diagnostics.Tracing;
    using System.Threading;

    public sealed class DotPulsarEventSource : EventSource
    {
#pragma warning disable IDE0052 // Remove unread private members
        private PollingCounter? _totalClientsCounter;
        private long _totalClients;

        private PollingCounter? _currentClientsCounter;
        private long _currentClients;

        private PollingCounter? _totalConnectionsCounter;
        private long _totalConnections;

        private PollingCounter? _currentConnectionsCounter;
        private long _currentConnections;

        private PollingCounter? _totalConsumersCounter;
        private long _totalConsumers;

        private PollingCounter? _currentConsumersCounter;
        private long _currentConsumers;

        private PollingCounter? _totalProducersCounter;
        private long _totalProducers;

        private PollingCounter? _currentProducersCounter;
        private long _currentProducers;

        private PollingCounter? _totalReadersCounter;
        private long _totalReaders;

        private PollingCounter? _currentReadersCounter;
        private long _currentReaders;
#pragma warning restore IDE0052 // Remove unread private members

        public static readonly DotPulsarEventSource Log = new();

        public DotPulsarEventSource() : base("DotPulsar") { }

        public void ClientCreated()
        {
            Interlocked.Increment(ref _totalClients);
            Interlocked.Increment(ref _currentClients);
        }

        public void ClientDisposed()
        {
            Interlocked.Decrement(ref _currentClients);
        }

        public void ConnectionCreated()
        {
            Interlocked.Increment(ref _totalConnections);
            Interlocked.Increment(ref _currentConnections);
        }

        public void ConnectionDisposed()
        {
            Interlocked.Decrement(ref _currentConnections);
        }

        public void ConsumerCreated()
        {
            Interlocked.Increment(ref _totalConsumers);
            Interlocked.Increment(ref _currentConsumers);
        }

        public void ConsumerDisposed()
        {
            Interlocked.Decrement(ref _currentConsumers);
        }

        public void ProducerCreated()
        {
            Interlocked.Increment(ref _totalProducers);
            Interlocked.Increment(ref _currentProducers);
        }

        public void ProducerDisposed()
        {
            Interlocked.Decrement(ref _currentProducers);
        }

        public void ReaderCreated()
        {
            Interlocked.Increment(ref _totalReaders);
            Interlocked.Increment(ref _currentReaders);
        }

        public void ReaderDisposed()
        {
            Interlocked.Decrement(ref _currentReaders);
        }

        protected override void OnEventCommand(EventCommandEventArgs command)
        {
            if (command.Command != EventCommand.Enable)
                return;

            _totalClientsCounter ??= new PollingCounter("total-clients", this, () => Volatile.Read(ref _totalClients))
            {
                DisplayName = "Total number of clients"
            };

            _currentClientsCounter ??= new PollingCounter("current-clients", this, () => Volatile.Read(ref _currentClients))
            {
                DisplayName = "Current number of clients"
            };

            _totalConnectionsCounter ??= new PollingCounter("total-connections", this, () => Volatile.Read(ref _totalConnections))
            {
                DisplayName = "Total number of connections"
            };

            _currentConnectionsCounter ??= new PollingCounter("current-connections", this, () => Volatile.Read(ref _currentConnections))
            {
                DisplayName = "Current number of connections"
            };

            _totalConsumersCounter ??= new PollingCounter("total-consumers", this, () => Volatile.Read(ref _totalConsumers))
            {
                DisplayName = "Total number of consumers"
            };

            _currentConsumersCounter ??= new PollingCounter("current-consumers", this, () => Volatile.Read(ref _currentConsumers))
            {
                DisplayName = "Current number of consumers"
            };

            _totalProducersCounter ??= new PollingCounter("total-producers", this, () => Volatile.Read(ref _totalProducers))
            {
                DisplayName = "Total number of producers"
            };

            _currentProducersCounter ??= new PollingCounter("current-producers", this, () => Volatile.Read(ref _currentProducers))
            {
                DisplayName = "Current number of producers"
            };

            _totalReadersCounter ??= new PollingCounter("total-readers", this, () => Volatile.Read(ref _totalReaders))
            {
                DisplayName = "Total number of readers"
            };

            _currentReadersCounter ??= new PollingCounter("current-readers", this, () => Volatile.Read(ref _currentReaders))
            {
                DisplayName = "Current number of readers"
            };
        }
    }
#endif
}
