﻿/*
 * 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 DotPulsar.Exceptions;
    using Exceptions;
    using System;
    using System.Net.Sockets;
    using System.Threading;
    using System.Threading.Tasks;

    public sealed class DefaultExceptionHandler : IHandleException
    {
        private readonly TimeSpan _retryInterval;

        public DefaultExceptionHandler(TimeSpan retryInterval)
            => _retryInterval = retryInterval;

        public async ValueTask OnException(ExceptionContext exceptionContext)
        {
            exceptionContext.Result = DetermineFaultAction(exceptionContext.Exception, exceptionContext.CancellationToken);

            if (exceptionContext.Result == FaultAction.Retry)
                await Task.Delay(_retryInterval, exceptionContext.CancellationToken).ConfigureAwait(false);

            exceptionContext.ExceptionHandled = true;
        }

        private static FaultAction DetermineFaultAction(Exception exception, CancellationToken cancellationToken)
            => exception switch
            {
                TooManyRequestsException _ => FaultAction.Retry,
                ChannelNotReadyException _ => FaultAction.Retry,
                ServiceNotReadyException _ => FaultAction.Retry,
                MetadataException _ => FaultAction.Retry,
                ConsumerNotFoundException _ => FaultAction.Retry,
                ConnectionDisposedException _ => FaultAction.Retry,
                AsyncLockDisposedException _ => FaultAction.Retry,
                PulsarStreamDisposedException _ => FaultAction.Retry,
                AsyncQueueDisposedException _ => FaultAction.Retry,
                LookupNotReadyException _ => FaultAction.Retry,
                OperationCanceledException _ => cancellationToken.IsCancellationRequested ? FaultAction.Rethrow : FaultAction.Retry,
                DotPulsarException _ => FaultAction.Rethrow,
                SocketException socketException => socketException.SocketErrorCode switch
                {
                    SocketError.HostNotFound => FaultAction.Rethrow,
                    SocketError.HostUnreachable => FaultAction.Rethrow,
                    SocketError.NetworkUnreachable => FaultAction.Rethrow,
                    _ => FaultAction.Retry
                },
                _ => FaultAction.Rethrow
            };
    }
}
