﻿/*
 * 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.Extensions
{
    using System;
    using Metadata = PulsarApi.MessageMetadata;

    public static class MessageMetadataExtensions
    {
        // Deliver at
        public static DateTime GetDeliverAtTimeAsDateTime(this Metadata metadata)
            => metadata.GetDeliverAtTimeAsDateTimeOffset().UtcDateTime;

        public static void SetDeliverAtTime(this Metadata metadata, DateTime timestamp)
            => metadata.SetDeliverAtTime(new DateTimeOffset(timestamp));

        public static DateTimeOffset GetDeliverAtTimeAsDateTimeOffset(this Metadata metadata)
            => DateTimeOffset.FromUnixTimeMilliseconds(metadata.DeliverAtTime);

        public static void SetDeliverAtTime(this Metadata metadata, DateTimeOffset timestamp)
            => metadata.DeliverAtTime = timestamp.ToUnixTimeMilliseconds();

        // Event time
        public static DateTime GetEventTimeAsDateTime(this Metadata metadata)
            => metadata.GetEventTimeAsDateTimeOffset().UtcDateTime;

        public static void SetEventTime(this Metadata metadata, DateTime timestamp)
            => metadata.SetEventTime(new DateTimeOffset(timestamp));

        public static DateTimeOffset GetEventTimeAsDateTimeOffset(this Metadata metadata)
            => DateTimeOffset.FromUnixTimeMilliseconds((long) metadata.EventTime);

        public static void SetEventTime(this Metadata metadata, DateTimeOffset timestamp)
            => metadata.EventTime = (ulong) timestamp.ToUnixTimeMilliseconds();

        // Key
        public static byte[]? GetKeyAsBytes(this Metadata metadata)
            => metadata.PartitionKeyB64Encoded ? Convert.FromBase64String(metadata.PartitionKey) : null;

        public static void SetKey(this Metadata metadata, string? key)
        {
            metadata.PartitionKey = key;
            metadata.PartitionKeyB64Encoded = false;
        }

        public static void SetKey(this Metadata metadata, byte[]? key)
        {
            if (key is null)
                return;

            metadata.PartitionKey = Convert.ToBase64String(key);
            metadata.PartitionKeyB64Encoded = true;
        }
    }
}
