using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;

namespace TechBot.Library
{
    public class CommandFactory
    {
        private static CommandBuilderCollection m_Commands = new CommandBuilderCollection();

        private CommandFactory()
        {
        }

        public static void LoadPlugins()
        {
            //get the file names of the dll files in the current directory.
            foreach (string fileName in Directory.GetFiles(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "*.dll"))
            {
                LoadPluginsFromDLLFile(fileName);
            }
        }

        private static void LoadPluginsFromDLLFile(string sFile)
        {
            Assembly assPlugin = Assembly.LoadFile(sFile);

            Console.WriteLine("Loading plugins from : {0}", assPlugin.Location);

            if (assPlugin != null)
            {
                foreach (Type pluginType in assPlugin.GetTypes())
                {
                    if (pluginType.IsSubclassOf(typeof(Command)))
                    {
                        if (pluginType.IsAbstract == false)
                        {
                            CommandBuilder cmdBuilder = new CommandBuilder(pluginType);

                            Console.WriteLine("{0}:{1}", 
                                cmdBuilder.Name,
                                cmdBuilder.Description);

                            //Add it to the list.
                            Commands.Add(new CommandBuilder(pluginType));
                        }
                    }
                }
            }
        }

        public static CommandBuilderCollection Commands
        {
            get { return m_Commands; }
        }
    }
}