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

    internal static class Program
    {
        private static async Task Main()
        {
            const string myTopic = "persistent://public/default/mytopic";

            var cts = new CancellationTokenSource();

            Console.CancelKeyPress += (sender, args) =>
            {
                cts.Cancel();
                args.Cancel = true;
            };

            await using var client = PulsarClient.Builder().Build(); //Connecting to pulsar://localhost:6650

            await using var reader = client.NewReader(Schema.String)
                .StartMessageId(MessageId.Earliest)
                .StateChangedHandler(Monitor)
                .Topic(myTopic)
                .Create();

            Console.WriteLine("Press Ctrl+C to exit");

            await ReadMessages(reader, cts.Token);
        }

        private static async Task ReadMessages(IReader<string> reader, CancellationToken cancellationToken)
        {
            try
            {
                await foreach (var message in reader.Messages(cancellationToken))
                {
                    Console.WriteLine("Received: " + message.Value());
                }
            }
            catch (OperationCanceledException) { }
        }

        private static void Monitor(ReaderStateChanged stateChanged, CancellationToken cancellationToken)
        {
            var stateMessage = stateChanged.ReaderState switch
            {
                ReaderState.Connected => "is connected",
                ReaderState.Disconnected => "is disconnected",
                ReaderState.Closed => "has closed",
                ReaderState.ReachedEndOfTopic => "has reached end of topic",
                ReaderState.Faulted => "has faulted",
                _ => $"has an unknown state '{stateChanged.ReaderState}'"
            };

            var topic = stateChanged.Reader.Topic;
            Console.WriteLine($"The reader for topic '{topic}' " + stateMessage);
        }
    }
}
