using System.Collections;
using Spring.Context;

namespace Spring.Validation
{
    /// <summary>
    /// An interface that validation errors containers have to implement.
    /// </summary>
    /// <author>Aleksandar Seovic</author>
    public interface IValidationErrors
    {
        /// <summary>
        /// Does this instance contain any validation errors?
        /// </summary>
        /// <remarks>
        /// <p>
        /// If this returns <see lang="true"/>, this means that it (obviously)
        /// contains no validation errors.
        /// </p>
        /// </remarks>
        /// <value><see lang="true"/> if this instance is empty.</value>
        bool IsEmpty { get; }
        
        /// <summary>
        /// Gets the list of all error providers.
        /// </summary>
        IList Providers { get; }

        /// <summary>
        /// Adds the supplied <paramref name="message"/> to this
        /// instance's collection of errors.
        /// </summary>
        /// <param name="provider">
        /// The provider that should be used for message grouping; can't be
        /// <see lang="null"/>.
        /// </param>
        /// <param name="message">The error message to add.</param>
        /// <exception cref="System.ArgumentNullException">
        /// If the supplied <paramref name="provider"/> or <paramref name="message"/> is <see langword="null"/>.
        /// </exception>
        void AddError(string provider, ErrorMessage message);

        /// <summary>
        /// Merges another instance of <see cref="ValidationErrors"/> into this one.
        /// </summary>
        /// <remarks>
        /// <p>
        /// If the supplied <paramref name="errorsToMerge"/> is <see lang="null"/>,
        /// then no errors will be added to this instance, and this method will
        /// (silently) return.
        /// </p>
        /// </remarks>
        /// <param name="errorsToMerge">
        /// The validation errors to merge; can be <see lang="null"/>.
        /// </param>
        void MergeErrors(IValidationErrors errorsToMerge);

        /// <summary>
        /// Gets the list of errors for the supplied error <paramref name="provider"/>.
        /// </summary>
        /// <remarks>
        /// <p>
        /// If there are no errors for the supplied <paramref name="provider"/>,
        /// an <b>empty</b> <see cref="System.Collections.IList"/> will be returned.
        /// </p>
        /// </remarks>
        /// <param name="provider">Error key that was used to group messages.</param>
        /// <returns>
        /// A list of all <see cref="ErrorMessage"/>s for the supplied lookup <paramref name="provider"/>.
        /// </returns>
        IList GetErrors(string provider);

        /// <summary>
        /// Gets the list of resolved error messages for the supplied lookup <paramref name="provider"/>.
        /// </summary>
        /// <remarks>
        /// <p>
        /// If there are no errors for the supplied lookup <paramref name="provider"/>,
        /// an <b>empty</b> <see cref="System.Collections.IList"/> will be returned.
        /// </p>
        /// </remarks>
        /// <param name="provider">Error key that was used to group messages.</param>
        /// <param name="messageSource"><see cref="IMessageSource"/> to resolve messages against.</param>
        /// <returns>
        /// A list of resolved error messages for the supplied lookup <paramref name="provider"/>.
        /// </returns>
        IList GetResolvedErrors(string provider, IMessageSource messageSource);
    }
}