﻿/*
 * 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.Buffers;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;

    internal static class Program
    {
        private static async Task Main(string[] args)
        {
            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()
                .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 reader, CancellationToken cancellationToken)
        {
            try
            {
                await foreach (var message in reader.Messages(cancellationToken))
                {
                    var data = Encoding.UTF8.GetString(message.Data.ToArray());
                    Console.WriteLine("Received: " + data);
                }
            }
            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);
        }
    }
}
