/*
	
	IRC-Bot "Kvasir"
    Copyright (C) 2016	Fenris Wolf (fenris@folksprak.org)
	
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
	
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
	
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
       
*/

var _fs = require("fs");

	
/**
 * @author fenris
 */
class klaso_kromajxo_ekstera extends klaso_kromajxo
{
	
	/**
	 * @author fenris
	 */
	protected vojo : string;
	
	
	/**
	 * @author fenris
	 */
	protected memoro : Object;
	
	
	/**
	 * @author fenris
	 */
	protected reagi_ : (enigo_kruda : Object, eligi : (eligo_kruda : Object)=>void, memoro ?: Object)=>void;
	
	
	/**
	 * @author fenris
	 */
	protected starigi_ : (finado : (eraro ?: Error)=>void, memoro ?: Object)=>void;
	
	
	/**
	 * @author fenris
	 */
	public constructor
	(
		datumoj :
		{
			identigilo ?: string;
			nomo ?: string;
			priskribo ?: string;
			uzo ?: string;
			auxtoro ?: string;
			starigi ?: (finado : (eraro ?: Error)=>void, memoro ?: Object)=>void;
			reagi ?: (enigo_kruda : Object, eligi : (eligo_kruda : Object)=>void)=>void;
			vojo ?: string;
		}
		= {}
	)
	{
		super(datumoj);
		this.meti_valorojn_(datumoj, false);
		this.memoro = {};
	}
	
	
	/**
	 * @override
	 * @author fenris
	 */
	public meti_valorojn_(datumoj : Object, ankaux_supraj : boolean = false) : void
	{
		if (ankaux_supraj) this.meti_valorojn(datumoj);
		this.vojo = alporti(datumoj, "vojo", null, 1);
		this.starigi_ = alporti<(finado : (eraro ?: Error)=>void, memoro ?: Object)=>void>(datumoj, "starigi", (finado => finado(null)), 0);
		this.reagi_ = alporti<(enigo_kruda : Object, eligi : (eligo_kruda : Object)=>void)=>void>(datumoj, "reagi", null, 1);
	}
	
	
	/**
	 * @override
	 * @author fenris
	 */
	public starigi(finado : (eraro ?: Error)=>void) : void
	{
		this.starigi_(finado, this.memoro);
	}
	
	
	/**
	 * @override
	 * @author fenris
	 */
	protected reagi(enigo_kruda : Object, eligi : (eligo_kruda : Object)=>void) : void
	{
		this.reagi_(enigo_kruda, eligi, this.memoro);
	}
	

	/**
	 * @author fenris
	 */
	protected static sxargi(vojo : string, uzado : (eraro : Error, datumoj : Object)=>void) : void
	{
		_fs.readFile
		(
			vojo,
			{"encoding": "utf8", "flag": "r"},
			function (eraro : Error, enhavo : string) : void
			{
				if (eraro != null)
				{
					uzado(eraro, null);
				}
				else
				{
					try
					{
						let datumoj : Object = eval("(function () {return (" + enhavo + ");})()");
						uzado(null, datumoj);
					}
					catch (escepto)
					{
						uzado(new Error(String(escepto)), null);
					}
				}
			}
		);
	}
	
	
	/**
	 * @author fenris
	 */
	public resxargi(fino : (eraro : Error)=>void = (eraro => {})) : void
	{
		let that : klaso_kromajxo_ekstera = this;
		klaso_kromajxo_ekstera.sxargi
		(
			this.vojo,
			function (eraro : Error, datumoj : Object) : void
			{
				if (eraro != null)
				{
					fino(eraro);
				}
				else
				{
					datumoj["vojo"] = that.vojo;
					that.meti_valorojn_(datumoj, true);
					that.starigi
					(
						function (eraro_ : Error) : void
						{
							if (eraro_ != null)
							{
								fino(eraro_);
							}
							else
							{
								fino(null);
							}
						}
					);
				}
			}
		);
	}
	
	
	/**
	 * @author fenris
	 */
	public static krei(vojo : string, uzado : (eraro : Error, kromajxo : klaso_kromajxo_ekstera)=>void) : void
	{
		klaso_kromajxo_ekstera.sxargi
		(
			vojo,
			function (eraro : Error, datumoj : Object) : void
			{
				if (eraro != null)
				{
					uzado(eraro, null);
				}
				else
				{
					datumoj["vojo"] = vojo;
					let kromajxo : klaso_kromajxo_ekstera = new klaso_kromajxo_ekstera(datumoj);
					uzado(null, kromajxo);
				}
			}
		);
	}
	
}