using System.Collections;

namespace Unity.VisualScripting
{
    /// <summary>
    /// Merges two or more dictionaries together.
    /// </summary>
    /// <remarks>
    /// If the same key is found more than once, only the value
    /// of the first dictionary with this key will be used.
    /// </remarks>
    [UnitCategory("Collections/Dictionaries")]
    [UnitOrder(5)]
    public sealed class MergeDictionaries : MultiInputUnit<IDictionary>
    {
        /// <summary>
        /// The merged dictionary.
        /// </summary>
        [DoNotSerialize]
        [PortLabelHidden]
        public ValueOutput dictionary { get; private set; }

        protected override void Definition()
        {
            dictionary = ValueOutput(nameof(dictionary), Merge);

            base.Definition();

            foreach (var input in multiInputs)
            {
                Requirement(input, dictionary);
            }
        }

        public IDictionary Merge(Flow flow)
        {
            var dictionary = new AotDictionary();

            for (var i = 0; i < inputCount; i++)
            {
                var inputDictionary = flow.GetValue<IDictionary>(multiInputs[i]);

                var enumerator = inputDictionary.GetEnumerator();

                while (enumerator.MoveNext())
                {
                    if (!dictionary.Contains(enumerator.Key))
                    {
                        dictionary.Add(enumerator.Key, enumerator.Value);
                    }
                }
            }

            return dictionary;
        }
    }
}