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

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

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

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

        /// <summary>
        /// The schema version of the message.
        /// </summary>
        byte[]? SchemaVersion { get; }

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

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

        /// <summary>
        /// Check whether the message has an event time.
        /// </summary>
        bool HasEventTime { get; }

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

        /// <summary>
        /// The event time of the message as an UTC DateTime.
        /// </summary>
        public DateTime EventTimeAsDateTime { get; }

        /// <summary>
        /// The event time of the message as a DateTimeOffset with an offset of 0.
        /// </summary>
        public DateTimeOffset EventTimeAsDateTimeOffset { get; }

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

        /// <summary>
        /// Check whether the message has a key.
        /// </summary>
        bool HasKey { get; }

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

        /// <summary>
        /// The key as bytes.
        /// </summary>
        byte[]? KeyBytes { get; }

        /// <summary>
        /// Check whether the message has an ordering key.
        /// </summary>
        bool HasOrderingKey { get; }

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

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

        /// <summary>
        /// The publish time of the message as an UTC DateTime.
        /// </summary>
        public DateTime PublishTimeAsDateTime { get; }

        /// <summary>
        /// The publish time of the message as a DateTimeOffset with an offset of 0.
        /// </summary>
        public DateTimeOffset PublishTimeAsDateTimeOffset { get; }

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