﻿/*
 * 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
{
    using System;
    using System.Buffers;
    using System.Collections.Generic;

    /// <summary>
    /// The message received by consumers and readers.
    /// </summary>
    public sealed class Message
    {
        internal Message(
            MessageId messageId,
            ReadOnlySequence<byte> data,
            string producerName,
            ulong sequenceId,
            uint redeliveryCount,
            ulong eventTime,
            ulong publishTime,
            IReadOnlyDictionary<string, string> properties,
            bool hasBase64EncodedKey,
            string? key,
            byte[]? orderingKey)
        {
            MessageId = messageId;
            Data = data;
            ProducerName = producerName;
            SequenceId = sequenceId;
            RedeliveryCount = redeliveryCount;
            EventTime = eventTime;
            PublishTime = publishTime;
            Properties = properties;
            HasBase64EncodedKey = hasBase64EncodedKey;
            Key = key;
            OrderingKey = orderingKey;
        }

        /// <summary>
        /// The id of the message.
        /// </summary>
        public MessageId MessageId { get; }

        /// <summary>
        /// The raw payload of the message.
        /// </summary>
        public ReadOnlySequence<byte> Data { get; }

        /// <summary>
        /// The name of the producer who produced the message.
        /// </summary>
        public string ProducerName { get; }

        /// <summary>
        /// The sequence id of the message.
        /// </summary>
        public ulong SequenceId { get; }

        /// <summary>
        /// The redelivery count (maintained by the broker) of the message.
        /// </summary>
        public uint RedeliveryCount { get; }

        /// <summary>
        /// Check whether the message has an event time.
        /// </summary>
        public bool HasEventTime => EventTime != 0;

        /// <summary>
        /// The event time of the message (unix time in milliseconds).
        /// </summary>
        public ulong EventTime { get; }

        /// <summary>
        /// The event time of the message.
        /// </summary>
        public DateTimeOffset EventTimeAsDateTimeOffset => DateTimeOffset.FromUnixTimeMilliseconds((long) EventTime);

        /// <summary>
        /// Check whether the key been base64 encoded.
        /// </summary>
        public bool HasBase64EncodedKey { get; }

        /// <summary>
        /// Check whether the message has a key.
        /// </summary>
        public bool HasKey => Key is not null;

        /// <summary>
        /// The key as a string.
        /// </summary>
        public string? Key { get; }

        /// <summary>
        /// The key as bytes.
        /// </summary>
        public byte[]? KeyBytes => Key is not null ? Convert.FromBase64String(Key) : null;

        /// <summary>
        /// Check whether the message has an ordering key.
        /// </summary>
        public bool HasOrderingKey => OrderingKey is not null;

        /// <summary>
        /// The ordering key of the message.
        /// </summary>
        public byte[]? OrderingKey { get; }

        /// <summary>
        /// The publish time of the message (unix time in milliseconds).
        /// </summary>
        public ulong PublishTime { get; }

        /// <summary>
        /// The publish time of the message.
        /// </summary>
        public DateTimeOffset PublishTimeAsDateTimeOffset => DateTimeOffset.FromUnixTimeMilliseconds((long) PublishTime);

        /// <summary>
        /// The properties of the message.
        /// </summary>
        public IReadOnlyDictionary<string, string> Properties { get; }
    }
}
