using System.IO.Compression;

namespace PARR.Infrastructure.Redis.Helpers
{
    /// <summary>
    /// Архивация/разарзивация данных
    /// </summary>
    internal static class CompressionHelper
    {
        // Не сжимать маленькие значения
        private const int MinCompressionSize = 1024; // 1Кб

        /// <summary>
        /// Сжать
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte[] Compress(byte[] data)
        {
            if (data.Length < MinCompressionSize)
                return data;
            
            using var output = new MemoryStream();
            using (var gzip = new GZipStream(output, CompressionLevel.Optimal))
            {
                gzip.Write(data, 0, data.Length);
            }

            return output.ToArray();
        }

        /// <summary>
        /// Разархивировать если это GZip
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte[] Decompress(byte[] data)
        {
            // Проверяем сигнатуру GZip (0x1F, 0x8B)
            if (data.Length < 2 || data[0] != 0x1F || data[1] != 0x8B)
                return data; // Не сжато

            using var input = new MemoryStream(data);
            using var gzip = new GZipStream(input, CompressionMode.Decompress);
            using var output = new MemoryStream();
            gzip.CopyTo(output);

            return output.ToArray();
        }
    }
}
