using Google.Protobuf;
using System;

namespace FrostFS.SDK.Cryptography;

public static class UUIDExtension
{
    public static Guid ToUuid(this ByteString id)
    {
        var bytes = id.ToByteArray();
        
        var orderedBytes = GetGuidBytesDirectOrder(bytes);

        return new Guid(orderedBytes);
    }
    
    /// <summary>
    /// Serializes Guid to binary representation in direct order bytes format
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public static byte[] ToBytes(this Guid id)
    {
        var bytes = id.ToByteArray();

        var orderedBytes = GetGuidBytesDirectOrder(bytes);

        return orderedBytes;
    }

    private static byte[] GetGuidBytesDirectOrder(byte[] source)
    {
        if (source.Length != 16)
            throw new ArgumentException("Wrong uuid binary format");

        return [
            source[3],
            source[2],
            source[1],
            source[0],
            source[5],
            source[4],
            source[7],
            source[6],
            source[8],
            source[9],
            source[10],
            source[11],
            source[12],
            source[13],
            source[14],
            source[15]
        ];
    }
}