﻿using System.IO;

namespace Google.Protobuf
{
    /// <summary>
    /// Extension methods on <see cref="IMessage"/> and <see cref="IMessage{T}"/>.
    /// </summary>
    public static class MessageExtensions
    {
        public static void MergeFrom(this IMessage message, byte[] data)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            ThrowHelper.ThrowIfNull(data, "data");
            CodedInputStream input = CodedInputStream.CreateInstance(data);
            message.MergeFrom(input);
            input.CheckLastTagWas(0);
        }

        public static void MergeFrom(this IMessage message, ByteString data)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            ThrowHelper.ThrowIfNull(data, "data");
            CodedInputStream input = data.CreateCodedInput();
            message.MergeFrom(input);
            input.CheckLastTagWas(0);
        }

        public static void MergeFrom(this IMessage message, Stream input)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            ThrowHelper.ThrowIfNull(input, "input");
            CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
            message.MergeFrom(codedInput);
            codedInput.CheckLastTagWas(0);
        }

        public static void MergeDelimitedFrom(this IMessage message, Stream input)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            ThrowHelper.ThrowIfNull(input, "input");
            int size = (int)CodedInputStream.ReadRawVarint32(input);
            Stream limitedStream = new LimitedInputStream(input, size);
            message.MergeFrom(limitedStream);
        }

        public static byte[] ToByteArray(this IMessage message)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            byte[] result = new byte[message.CalculateSize()];
            CodedOutputStream output = CodedOutputStream.CreateInstance(result);
            message.WriteTo(output);
            output.CheckNoSpaceLeft();
            return result;
        }

        public static void WriteTo(this IMessage message, Stream output)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            ThrowHelper.ThrowIfNull(output, "output");
            CodedOutputStream codedOutput = CodedOutputStream.CreateInstance(output);
            message.WriteTo(codedOutput);
            codedOutput.Flush();
        }

        public static void WriteDelimitedTo(this IMessage message, Stream output)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            ThrowHelper.ThrowIfNull(output, "output");
            CodedOutputStream codedOutput = CodedOutputStream.CreateInstance(output);
            codedOutput.WriteRawVarint32((uint)message.CalculateSize());
            message.WriteTo(codedOutput);
            codedOutput.Flush();
        }

        public static ByteString ToByteString(this IMessage message)
        {
            ThrowHelper.ThrowIfNull(message, "message");
            return ByteString.AttachBytes(message.ToByteArray());
        }        
    }
}
