using System;
using System.Collections.Generic;

namespace Substrate.Core
{
    /// <summary>
    /// A callback function to open a world and return it as an instance of a concrete derivative of <see cref="NbtWorld"/>.
    /// </summary>
    /// <param name="path">The path to the directory of the world to open.</param>
    /// <returns>An instance of a concrete derivative of <see cref="NbtWorld"/>.</returns>
    public delegate NbtWorld OpenWorldCallback (string path);

    /// <summary>
    /// Event arugments and response data for any handlers trying to determine if they can open a given world.
    /// </summary>
    public class OpenWorldEventArgs : EventArgs
    {
        private List<OpenWorldCallback> _handlers;
        private string _path;

        /// <summary>
        /// Create a new instance of event arguments.
        /// </summary>
        /// <param name="path">The path to the directory of a world.</param>
        public OpenWorldEventArgs (string path)
            : base()
        {
            _path = path;
            _handlers = new List<OpenWorldCallback>();
        }

        /// <summary>
        /// Gets the path to the directory of a world being investigated.
        /// </summary>
        public string Path
        {
            get { return _path; }
        }

        /// <summary>
        /// Adds an <see cref="OpenWorldCallback"/> delegate that can open a world and return a corresponding <see cref="NbtWorld"/> object.
        /// </summary>
        /// <param name="callback">The delegate to return to the code that raised the event.</param>
        public void AddHandler (OpenWorldCallback callback)
        {
            _handlers.Add(callback);
        }

        internal int HandlerCount
        {
            get { return _handlers.Count; }
        }

        internal ICollection<OpenWorldCallback> Handlers
        {
            get { return _handlers; }
        }
    }
}