﻿/*
 * 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
{
    using DotPulsar.Abstractions;
    using System.Threading.Tasks;

    public static class StateMonitor

    {
        public static async Task MonitorProducer(IProducer producer, IHandleStateChanged<ProducerStateChanged> handler)
        {
            await Task.Yield();

            var state = ProducerState.Disconnected;

            while (!producer.IsFinalState(state))
            {
                var stateChanged = await producer.StateChangedFrom(state, handler.CancellationToken).ConfigureAwait(false);
                state = stateChanged.ProducerState;
                try
                {
                    await handler.OnStateChanged(stateChanged, handler.CancellationToken).ConfigureAwait(false);
                }
                catch
                {
                    // Ignore
                }
            }
        }

        public static async Task MonitorConsumer(IConsumer consumer, IHandleStateChanged<ConsumerStateChanged> handler)
        {
            await Task.Yield();

            var state = ConsumerState.Disconnected;

            while (!consumer.IsFinalState(state))
            {
                var stateChanged = await consumer.StateChangedFrom(state, handler.CancellationToken).ConfigureAwait(false);
                state = stateChanged.ConsumerState;
                try
                {
                    await handler.OnStateChanged(stateChanged, handler.CancellationToken).ConfigureAwait(false);
                }
                catch
                {
                    // Ignore
                }
            }
        }

        public static async Task MonitorReader(IReader reader, IHandleStateChanged<ReaderStateChanged> handler)
        {
            await Task.Yield();

            var state = ReaderState.Disconnected;

            while (!reader.IsFinalState(state))
            {
                var stateChanged = await reader.StateChangedFrom(state, handler.CancellationToken).ConfigureAwait(false);
                state = stateChanged.ReaderState;
                try
                {
                    await handler.OnStateChanged(stateChanged, handler.CancellationToken).ConfigureAwait(false);
                }
                catch
                {
                    // Ignore
                }
            }
        }
    }
}
