﻿using System.IO;

namespace Google.Protobuf
{
    // TODO: MessageExtensions?
    public static class Extensions
    {
        public static void MergeFrom(this IMessage message, byte[] data)
        {
            CodedInputStream input = CodedInputStream.CreateInstance(data);
            message.MergeFrom(input);
            input.CheckLastTagWas(0);
        }

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

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

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

        public static byte[] ToByteArray(this IMessage 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)
        {
            CodedOutputStream codedOutput = CodedOutputStream.CreateInstance(output);
            message.WriteTo(codedOutput);
            codedOutput.Flush();
        }

        public static void WriteTo(this IMessage message, CodedOutputStream output)
        {
            message.WriteTo(output);
        }

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

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