#region Copyright notice and license

// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
// http://github.com/jskeet/dotnet-protobufs/
// Original C++/Java/Python code:
// http://code.google.com/p/protobuf/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#endregion

using System;
using System.Collections;
using System.Collections.Generic;
using Google.ProtocolBuffers.Descriptors;
using Google.ProtocolBuffers.FieldAccess;

namespace Google.ProtocolBuffers
{
    /// <summary>
    /// All generated protocol message builder classes extend this class. It implements
    /// most of the IBuilder interface using reflection. Users can ignore this class
    /// as an implementation detail.
    /// </summary>
    public abstract partial class GeneratedBuilder<TMessage, TBuilder> : AbstractBuilder<TMessage, TBuilder>
        where TMessage : GeneratedMessage<TMessage, TBuilder>
        where TBuilder : GeneratedBuilder<TMessage, TBuilder>, new()
    {
        /// <summary>
        /// Returns the message being built at the moment.
        /// </summary>
        protected abstract TMessage MessageBeingBuilt { get; }

        protected internal FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors
        {
            get { return DefaultInstanceForType.FieldAccessorsFromBuilder; }
        }

        public override IDictionary<FieldDescriptor, object> AllFields
        {
            get { return MessageBeingBuilt.AllFields; }
        }

        public override object this[FieldDescriptor field]
        {
            get
            {
                // For repeated fields, the underlying list object is still modifiable at this point.
                // Make sure not to expose the modifiable list to the caller.
                return field.IsRepeated
                           ? InternalFieldAccessors[field].GetRepeatedWrapper(ThisBuilder)
                           : MessageBeingBuilt[field];
            }
            set { InternalFieldAccessors[field].SetValue(ThisBuilder, value); }
        }

        /// <summary>
        /// Called by derived classes to parse an unknown field.
        /// </summary>
        /// <returns>true unless the tag is an end-group tag</returns>
        protected virtual bool ParseUnknownField(ICodedInputStream input, UnknownFieldSet.Builder unknownFields,
                                                 ExtensionRegistry extensionRegistry, uint tag, string fieldName)
        {
            return unknownFields.MergeFieldFrom(tag, input);
        }

        public override MessageDescriptor DescriptorForType
        {
            get { return DefaultInstanceForType.DescriptorForType; }
        }

        public override int GetRepeatedFieldCount(FieldDescriptor field)
        {
            return MessageBeingBuilt.GetRepeatedFieldCount(field);
        }

        public override object this[FieldDescriptor field, int index]
        {
            get { return MessageBeingBuilt[field, index]; }
            set { InternalFieldAccessors[field].SetRepeated(ThisBuilder, index, value); }
        }

        public override bool HasOneof(OneofDescriptor oneof)
        {
            return MessageBeingBuilt.HasOneof(oneof);
        }

        public override FieldDescriptor OneofFieldDescriptor(OneofDescriptor oneof)
        {
            return MessageBeingBuilt.OneofFieldDescriptor(oneof);
        }

        public override bool HasField(FieldDescriptor field)
        {
            return MessageBeingBuilt.HasField(field);
        }

        public override IBuilder CreateBuilderForField(FieldDescriptor field)
        {
            return InternalFieldAccessors[field].CreateBuilder();
        }

        public override TBuilder ClearField(FieldDescriptor field)
        {
            InternalFieldAccessors[field].Clear(ThisBuilder);
            return ThisBuilder;
        }

        public override TBuilder ClearOneof(OneofDescriptor oneof)
        {
            InternalFieldAccessors.Oneof(oneof).Clear(ThisBuilder);
            return ThisBuilder;
        }

        public override TBuilder MergeFrom(TMessage other)
        {
            if (other.DescriptorForType != InternalFieldAccessors.Descriptor)
            {
                throw new ArgumentException("Message type mismatch");
            }

            foreach (KeyValuePair<FieldDescriptor, object> entry in other.AllFields)
            {
                FieldDescriptor field = entry.Key;
                if (field.IsRepeated)
                {
                    // Concatenate repeated fields
                    foreach (object element in (IEnumerable) entry.Value)
                    {
                        AddRepeatedField(field, element);
                    }
                }
                else if (field.MappedType == MappedType.Message && HasField(field))
                {
                    // Merge singular embedded messages
                    IMessageLite oldValue = (IMessageLite) this[field];
                    this[field] = oldValue.WeakCreateBuilderForType()
                        .WeakMergeFrom(oldValue)
                        .WeakMergeFrom((IMessageLite) entry.Value)
                        .WeakBuildPartial();
                }
                else
                {
                    // Just overwrite
                    this[field] = entry.Value;
                }
            }

            //Fix for unknown fields not merging, see java's AbstractMessage.Builder<T> line 236
            MergeUnknownFields(other.UnknownFields);

            return ThisBuilder;
        }

        public override TBuilder MergeUnknownFields(UnknownFieldSet unknownFields)
        {
            if (unknownFields != UnknownFieldSet.DefaultInstance)
            {
                TMessage result = MessageBeingBuilt;
                result.SetUnknownFields(UnknownFieldSet.CreateBuilder(result.UnknownFields)
                                            .MergeFrom(unknownFields)
                                            .Build());
            }
            return ThisBuilder;
        }

        public override TBuilder AddRepeatedField(FieldDescriptor field, object value)
        {
            InternalFieldAccessors[field].AddRepeated(ThisBuilder, value);
            return ThisBuilder;
        }

        /// <summary>
        /// Like Build(), but will wrap UninitializedMessageException in
        /// InvalidProtocolBufferException.
        /// </summary>
        public TMessage BuildParsed()
        {
            if (!IsInitialized)
            {
                throw new UninitializedMessageException(MessageBeingBuilt).AsInvalidProtocolBufferException();
            }
            return BuildPartial();
        }

        /// <summary>
        /// Implementation of <see cref="IBuilder{TMessage, TBuilder}.Build" />.
        /// </summary>
        public override TMessage Build()
        {
            // If the message is null, we'll throw a more appropriate exception in BuildPartial.
            if (!IsInitialized)
            {
                throw new UninitializedMessageException(MessageBeingBuilt);
            }
            return BuildPartial();
        }

        public override UnknownFieldSet UnknownFields
        {
            get { return MessageBeingBuilt.UnknownFields; }
            set { MessageBeingBuilt.SetUnknownFields(value); }
        }
    }
}