/*
	
	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/>.
       
*/


/**
 * @author fenris
 */
abstract class klaso_kromajxo
{
	
	/**
	 * @author fenris
	 */
	protected identigilo : string;
	
	
	/**
	 * @author fenris
	 */
	protected nomo : string;
	
	
	/**
	 * @author fenris
	 */
	protected priskribo : string;
	
	
	/**
	 * @author fenris
	 */
	protected uzo : string;
	
	
	/**
	 * @author fenris
	 */
	protected auxtoro : string;
	
	
	/**
	 * @author fenris
	 */
	public constructor
	(
		datumoj :
		{
			identigilo ?: string;
			nomo ?: string;
			priskribo ?: string;
			uzo ?: string;
			auxtoro ?: string;
		}
		= {}
	)
	{
		this.meti_valorojn(datumoj);
	}
	
	
	/**
	 * @author fenris
	 */
	public meti_valorojn(datumoj : Object) : void
	{
		this.identigilo = alporti<string>(datumoj, "identigilo", cxeno_generi("kromajxo_"), 1);
		this.nomo = alporti<string>(datumoj, "nomo", null, 0);
		this.priskribo = alporti<string>(datumoj, "priskribo", null, 0);
		this.uzo = alporti(datumoj, "uzo", null, 0);
		this.auxtoro = alporti<string>(datumoj, "auxtoro", null, 0);
	}
	
	
	/**
	 * @author fenris
	 */
	public identigilo_legi() : string
	{
		return this.identigilo;
	}
	
	
	/**
	 * @author fenris
	 */
	public nomo_legi() : string
	{
		return this.nomo;
	}
	
	
	/**
	 * @author fenris
	 */
	public priskribo_legi() : string
	{
		return this.priskribo;
	}
	
	
	/**
	 * @author fenris
	 */
	public uzo_legi() : string
	{
		return this.uzo;
	}
	
	
	/**
	 * @author fenris
	 */
	public auxtoro_legi() : string
	{
		return this.auxtoro;
	}
	
	
	/**
	 * @todo sekura respondado estus mojosa
	 * @author fenris
	 */
	public enigi(enigo : klaso_evento_eniga, eligi : (eligo : klaso_evento_eliga)=>void) : void
	{
		let that : klaso_kromajxo = this;
		this.reagi
		(
			enigo.kruda_al(),
			eligo_kruda => eligi(klaso_evento_eliga_mesagxo.kruda_de(eligo_kruda))
		)
		/*
		function respondi_sekure(linioj)
		{
			if (linioj.length <= 5)
			{
				linioj.forEach(linio => respondi({"tipo": "mesagxo", "parametroj": {"celo": enigo_kruda["parametroj"]["fonto"], "enhavo": linio}}));
			}
			else
			{
				var avizo = "Tro multe da rezultoj, ili senditos al vi private";
				respondi({"tipo": "mesagxo", "parametroj": {"celo": enigo_kruda["parametroj"]["fonto"], "alparolato": enigo_kruda["parametroj"]["sendinto"], "enhavo": avizo}});
				linioj.forEach(linio => respondi({"tipo": "mesagxo", "parametroj": {"celo": enigo_kruda["parametroj"]["sendinto"], "enhavo": linio}}));
			}
		}
		 */
	}
		
	
	/**
	 * @author fenris
	 */
	public starigi(finado : (eraro ?: Error)=>void) : void
	{
		finado(null);
	}
	
	
	/**
	 * @author fenris
	 */
	protected abstract reagi(enigo_kruda : Object, eligi : (eligo_kruda : Object)=>void) : void;
	
}