/*
	
	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
	 */
	public constructor
	(
		identigilo : string = null,
		nomo : string = null,
		priskribo : string = null,
		auxtoro : string = null,
		reagi_ : (enigo_kruda : Object, eligi : (eligo_kruda : Object)=>void)=>void
	)
	{
		super(identigilo, nomo, priskribo, auxtoro);
		this.reagi_ = reagi_;
		this.vojo = null;
		this.memoro = {};
	}
	
	
	/**
	 * @author fenris
	 */
	public resxargi(fino : (eraro : Error)=>void = function (eraro : Error) : void {}) : 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
				{
					that.nomo = datumoj["nomo"];
					that.priskribo = datumoj["priskribo"];
					that.auxtoro = datumoj["auxtoro"];
					that.reagi_ = datumoj["reagi"];
					fino(null);
				}
			}
		);
	}
	
	
	/**
	 * @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 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
				{
					let kromajxo : klaso_kromajxo_ekstera = new klaso_kromajxo_ekstera
					(
						datumoj["identigilo"],
						datumoj["nomo"],
						datumoj["priskribo"],
						datumoj["auxtoro"],
						datumoj["reagi"]
					);
					kromajxo.vojo = vojo;
					uzado(null, kromajxo);
				}
			}
		);
	}
	
}