module dworld.dworld_main;

import std.stdio;
import dworld.plugin;
import dworld.plugin_loader;

import dworld.util.number;

/**
 * dworld 起動
 */
int main(string[] args)
{
	PluginContext context = new PluginContextImpl();

	long val = longValue(args[1]);
	writefln("%s", val);

	/*
	for (int i = 1; i < args.length; i++)
	{
		context.startPlugin(args[i]);
	}
	for (int i = 1; i < args.length; i++)
	{
		context.stopPlugin(args[i]);
	}
	*/

	return 0;
}


/**
 * PluginContext の実装.
 */
class PluginContextImpl : PluginContext
{

	private
	{
		Plugin[string]    pluginList;
		PluginApi[string] pluginApiList;
	}


	/**
	 * Plugin API を登録します.
	 *
	 */
	public
	void registPluginApi(PluginApi api)
	in
	{
		assert(api !is null);
		if (name in this.pluginApiList)
		{	// 上書き
			writefln("override api '%s'", api.getName());
		}
	}
	body
	{
		string name = api.getName();
		this.pluginApiList[name] = api;
	}


	/**
	 * 登録されているプラグインより,
	 * 指定された名前に対応する PluginApi を取得します.
	 *
	 * Params:
	 *	name = 名前
	 * Return:
	 *	PluginApi
	 */
	public
	PluginApi getPluginApi(string name)
	{
		return this.pluginApiList[name];
	}


	/**
	 * Plugin をインストールします.
	 *
	 * Params:
	 *	url = URL
	 */
	public
	void installPlugin(string url)
	{
	}


	/**
	 * Plugin を開始します.
	 *
	 * Params:
	 *	name = プラグイン名
	 */
	public
	void startPlugin(string name)
	{
		try
		{
			Plugin plugin = loadPlugin(name);
			if (plugin !is null)
			{
				this.pluginList[name] = plugin;
				plugin.start(this);
			}
		}
		catch (Exception e)
		{
			
		}
	}


	/**
	 * Plugin を終了します.
	 *
	 * Params:
	 *	name = プラグイン名
	 */
	public
	void stopPlugin(string name)
	{
		if (name in this.pluginList)
		{
			Plugin plugin = this.pluginList[name];
			plugin.stop(this);
			this.pluginList.remove(name);
			unloadPlugin(plugin);
		}
		else
		{
			writefln("not found plugin %s", name);
		}
	}

}


