﻿#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
// Copyright 2015 Google Inc.  All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// 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.Collections.Generic;
using System.Linq;

namespace Google.Protobuf.Reflection
{
    /// <summary>
    /// An immutable registry of types which can be looked up by their full name.
    /// </summary>
    public sealed class TypeRegistry
    {
        /// <summary>
        /// An empty type registry, containing no types.
        /// </summary>
        public static TypeRegistry Empty { get; } = new TypeRegistry(new Dictionary<string, MessageDescriptor>());

        private readonly Dictionary<string, MessageDescriptor> fullNameToMessageMap;

        private TypeRegistry(Dictionary<string, MessageDescriptor> fullNameToMessageMap)
        {
            this.fullNameToMessageMap = fullNameToMessageMap;
        }

        /// <summary>
        /// Attempts to find a message descriptor by its full name.
        /// </summary>
        /// <param name="fullName">The full name of the message, which is the dot-separated
        /// combination of package, containing messages and message name</param>
        /// <returns>The message descriptor corresponding to <paramref name="fullName"/> or null
        /// if there is no such message descriptor.</returns>
        public MessageDescriptor Find(string fullName)
        {
            MessageDescriptor ret;
            // Ignore the return value as ret will end up with the right value either way.
            fullNameToMessageMap.TryGetValue(fullName, out ret);
            return ret;
        }

        /// <summary>
        /// Creates a type registry from the specified set of file descriptors.
        /// </summary>
        /// <remarks>
        /// This is a convenience overload for <see cref="FromFiles(IEnumerable{FileDescriptor})"/>
        /// to allow calls such as <c>TypeRegistry.FromFiles(descriptor1, descriptor2)</c>.
        /// </remarks>
        /// <param name="fileDescriptors">The set of files to include in the registry. Must not contain null values.</param>
        /// <returns>A type registry for the given files.</returns>
        public static TypeRegistry FromFiles(params FileDescriptor[] fileDescriptors)
        {
            return FromFiles((IEnumerable<FileDescriptor>) fileDescriptors);
        }

        /// <summary>
        /// Creates a type registry from the specified set of file descriptors.
        /// </summary>
        /// <remarks>
        /// All message types within all the specified files are added to the registry, and
        /// the dependencies of the specified files are also added, recursively.
        /// </remarks>
        /// <param name="fileDescriptors">The set of files to include in the registry. Must not contain null values.</param>
        /// <returns>A type registry for the given files.</returns>
        public static TypeRegistry FromFiles(IEnumerable<FileDescriptor> fileDescriptors)
        {
            ProtoPreconditions.CheckNotNull(fileDescriptors, nameof(fileDescriptors));
            var builder = new Builder();
            foreach (var file in fileDescriptors)
            {
                builder.AddFile(file);
            }
            return builder.Build();
        }

        /// <summary>
        /// Creates a type registry from the file descriptor parents of the specified set of message descriptors.
        /// </summary>
        /// <remarks>
        /// This is a convenience overload for <see cref="FromMessages(IEnumerable{MessageDescriptor})"/>
        /// to allow calls such as <c>TypeRegistry.FromFiles(descriptor1, descriptor2)</c>.
        /// </remarks>
        /// <param name="messageDescriptors">The set of message descriptors to use to identify file descriptors to include in the registry.
        /// Must not contain null values.</param>
        /// <returns>A type registry for the given files.</returns>
        public static TypeRegistry FromMessages(params MessageDescriptor[] messageDescriptors)
        {
            return FromMessages((IEnumerable<MessageDescriptor>) messageDescriptors);
        }

        /// <summary>
        /// Creates a type registry from the file descriptor parents of the specified set of message descriptors.
        /// </summary>
        /// <remarks>
        /// The specified message descriptors are only used to identify their file descriptors; the returned registry
        /// contains all the types within the file descriptors which contain the specified message descriptors (and
        /// the dependencies of those files), not just the specified messages.
        /// </remarks>
        /// <param name="messageDescriptors">The set of message descriptors to use to identify file descriptors to include in the registry.
        /// Must not contain null values.</param>
        /// <returns>A type registry for the given files.</returns>
        public static TypeRegistry FromMessages(IEnumerable<MessageDescriptor> messageDescriptors)
        {
            ProtoPreconditions.CheckNotNull(messageDescriptors, nameof(messageDescriptors));
            return FromFiles(messageDescriptors.Select(md => md.File));
        }

        /// <summary>
        /// Builder class which isn't exposed, but acts as a convenient alternative to passing round two dictionaries in recursive calls.
        /// </summary>
        private class Builder
        {
            private readonly Dictionary<string, MessageDescriptor> types;
            private readonly HashSet<string> fileDescriptorNames;

            internal Builder()
            {
                types = new Dictionary<string, MessageDescriptor>();
                fileDescriptorNames = new HashSet<string>();
            }

            internal void AddFile(FileDescriptor fileDescriptor)
            {
                if (!fileDescriptorNames.Add(fileDescriptor.Name))
                {
                    return;
                }
                foreach (var dependency in fileDescriptor.Dependencies)
                {
                    AddFile(dependency);
                }
                foreach (var message in fileDescriptor.MessageTypes)
                {
                    AddMessage(message);
                }
            }

            private void AddMessage(MessageDescriptor messageDescriptor)
            {
                foreach (var nestedType in messageDescriptor.NestedTypes)
                {
                    AddMessage(nestedType);
                }
                // This will overwrite any previous entry. Given that each file should
                // only be added once, this could be a problem such as package A.B with type C,
                // and package A with type B.C... it's unclear what we should do in that case.
                types[messageDescriptor.FullName] = messageDescriptor;
            }

            internal TypeRegistry Build()
            {
                return new TypeRegistry(types);
            }
        }
    }
}
