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

    public sealed class NotReadyChannel<TMessage> : IConsumerChannel<TMessage>, IProducerChannel
    {
        public ValueTask DisposeAsync()
            => new();

        public ValueTask ClosedByClient(CancellationToken cancellationToken)
            => new();

        public ValueTask<IMessage<TMessage>> Receive(CancellationToken cancellationToken = default)
            => throw GetException();

        public Task<CommandSendReceipt> Send(MessageMetadata metadata, ReadOnlySequence<byte> payload, CancellationToken cancellationToken)
            => throw GetException();

        public Task Send(CommandAck command, CancellationToken cancellationToken)
            => throw GetException();

        public Task Send(CommandRedeliverUnacknowledgedMessages command, CancellationToken cancellationToken)
            => throw GetException();

        public Task Send(CommandUnsubscribe command, CancellationToken cancellationToken)
            => throw GetException();

        public Task Send(CommandSeek command, CancellationToken cancellationToken)
            => throw GetException();

        public Task<MessageId> Send(CommandGetLastMessageId command, CancellationToken cancellationToken)
            => throw GetException();

        private static Exception GetException()
            => new ChannelNotReadyException();
    }
}
