using System;

using System.Collections.Generic;
using System.Text;

namespace Wayne.Lib
{
    /// <summary>
    /// Handles a collection of IConnectable items, and checks them all so they are connected.
    /// </summary>
    public class ConnectionChecker
    {
        private readonly IList<ConnectableItem> connectableItems = new List<ConnectableItem>();
        private readonly object connectableItemsLock=new object();

        /// <summary>
        /// Is all connectable items connected?
        /// </summary>
        /// <returns></returns>
        public bool IsConnectedToAll()
        {
            lock (connectableItemsLock)
            {
                foreach (var connectableItem in connectableItems)
                {
                    if (connectableItem.Connectable.ConnectionState != DeviceConnectionState.Connected)
                        return false;
                }
            }
            return true;
        }

        /// <summary>
        /// Adds a connectable entity to the check.
        /// </summary>
        /// <param name="connectable"></param>
        /// <param name="connectableDisplayName"></param>
        public void AddConnectableToCheck(IConnectable connectable, string connectableDisplayName)
        {
            if(connectable == null)
                throw new ArgumentNullException("connectable", "A instance of IConnectable is required.");

            connectableItems.Add(new ConnectableItem() { Connectable = connectable, DisplayName = connectableDisplayName});
        }

        /// <summary>
        /// Gets a list of strings containingt those items that are not connected, and their current connection state.
        /// </summary>
        /// <returns></returns>
        public IList<string> GetUnconnectedAsText()
        {
            IList<string> reasons = new List<string>();

            foreach (var connectableItem in connectableItems)
            {
                if (connectableItem.Connectable.ConnectionState != DeviceConnectionState.Connected)
                    reasons.Add(connectableItem.DisplayName + ".ConnectionState = " + connectableItem.Connectable.ConnectionState);
            }

            return reasons;
        }

        class ConnectableItem
        {
            public IConnectable Connectable { get; set; }
            public string DisplayName { get; set; }
        }
    }
}