using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;

namespace ScrewTurn.Wiki {

	/// <summary>
	/// Allows to compress and decompress byte streams in memory.
	/// </summary>
	public static class Compressor {

		/// <summary>
		/// Compresses data.
		/// </summary>
		/// <param name="data">The data to compress.</param>
		/// <returns>The compressed data.</returns>
		public static byte[] Compress(byte[] data) {
			using(MemoryStream output = new MemoryStream()) {
				using(GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true)) {
					gzip.Write(data, 0, data.Length);
					gzip.Close();
				}
				return output.ToArray();
			}
		}

		/// <summary>
		/// Decompresses data.
		/// </summary>
		/// <param name="data">The data to decompress.</param>
		/// <returns>The decompressed data.</returns>
		public static byte[] Decompress(byte[] data) {
			using(MemoryStream input = new MemoryStream()) {
				input.Write(data, 0, data.Length);
				input.Position = 0;
				using(GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true)) {
					using(MemoryStream output = new MemoryStream()) {
						byte[] buff = new byte[64];
						int read = -1;
						read = gzip.Read(buff, 0, buff.Length);
						while(read > 0) {
							output.Write(buff, 0, read);
							read = gzip.Read(buff, 0, buff.Length);
						}
						gzip.Close();
						return output.ToArray();
					}
				}
			}
		}

	}

}