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

    public static class MessagePackageExtensions
    {
        public static uint GetMetadataSize(this MessagePackage package)
            => package.Data.ReadUInt32(Constants.MetadataSizeOffset, true);

        public static MessageMetadata ExtractMetadata(this MessagePackage package, uint metadataSize)
            => Serializer.Deserialize<MessageMetadata>(package.Data.Slice(Constants.MetadataOffset, metadataSize));

        public static ReadOnlySequence<byte> ExtractData(this MessagePackage package, uint metadataSize)
            => package.Data.Slice(Constants.MetadataOffset + metadataSize);

        public static bool ValidateMagicNumberAndChecksum(this MessagePackage package)
            => StartsWithMagicNumber(package.Data) && HasValidChecksum(package.Data);

        private static bool StartsWithMagicNumber(ReadOnlySequence<byte> input)
            => input.StartsWith(Constants.MagicNumber);

        private static bool HasValidChecksum(ReadOnlySequence<byte> input)
            => input.ReadUInt32(Constants.MagicNumber.Length, true) == Crc32C.Calculate(input.Slice(Constants.MetadataSizeOffset));
    }
}
