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

type tipo_agoj =
{
	anigxi ?: (kanalo : string, modo ?: boolean)=>tipo_plenumanto<Array<string>, Error>;
	malanigxi ?: (kanalo : string)=>tipo_plenumanto<Array<string>, Error>;
	listigi ?: ()=>tipo_plenumanto<Array<string>, Error>;
	detaloj ?: (identigilo : string)=>tipo_plenumanto<Array<string>, Error>;
	sxalti ?: (identigilo : string, aktiva ?: boolean)=>tipo_plenumanto<Array<string>, Error>;
	resxargi ?: (identigilo : string)=>tipo_plenumanto<Array<string>, Error>;
	aldoni ?: (nomo : string)=>tipo_plenumanto<Array<string>, Error>;
	elmontri_helpon ?: ()=>tipo_plenumanto<Array<string>, Error>;
};


/**
 * @author fenris
 */
class klaso_kromajxo_stirado extends klaso_kromajxo
{
	
	/**
	 * @author fenris
	 */
	protected permesuloj : Array<string>;
	
	
	/**
	 * @author fenris
	 */
	protected agoj : tipo_agoj;
	
	
	/**
	 * @author fenris
	 */
	public constructor
	(
		permesuloj : Array<string> = new Array<string>(),
		agoj : tipo_agoj
	)
	{
		super
		(
			{
				"identigilo": "stirado",
				"nomo": "Stirado",
				"priskribo": "stiras aliajn kromajxojn kaj elmontras informojn pri ili",
				"uzo": null,
				"auxtoro": "fenris",
			}
		);
		this.permesuloj = permesuloj;
		this.agoj = agoj;
	}
	
	
	/**
	 * @override
	 * @todo la principo de "listigi" uzendas
	 * @author fenris
	 */
	public reagi(enigo_kruda : Object, eligi : (eligo_kruda : Object)=>void) : void
	{
		let that : klaso_kromajxo_stirado = this;
		
		function ujumi(foo : ()=>void) : void
		{
			if (that.permesuloj.indexOf(enigo_kruda["parametroj"]["sendinto"]) >= 0)
			{
				foo();
			}
			else
			{
				eligi
				(
					{
						"tipo": "mesagxo",
						"parametroj":
						{
							"celo": enigo_kruda["parametroj"]["fonto"],
							"enhavo": "vi ne rajtas fari tion",
						}
					}
				);
			}
		}
		function eligi_(linioj : Array<string>) : void
		{
			linioj.forEach(linio => eligi({"tipo": "mesagxo", "parametroj": {"celo": enigo_kruda["parametroj"]["fonto"], "enhavo": linio}}));
		}
		function erari(x : Error) : void
		{
			console.warn(x);
		}
		switch (enigo_kruda["tipo"])
		{
			case "mesagxo":
			{
				let resto : string = enigo_kruda["parametroj"]["enhavo"];
				[
					{
						"skemoj": [new RegExp("^!\\s*(?:kanalo|k)\\s*(?:anigxi|a|>)\\s*(#\\S+)$")],
						"ago": x => ujumi(() => this.agoj.anigxi(x[0], true)(eligi_, erari)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kanalo|k)\\s*(?:malanigxi|m|<)\\s*(#\\S+)$")],
						"ago": x => ujumi(() => this.agoj.anigxi(x[0], false)(eligi_, erari)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:listigi|l)$")/*, new RegExp("$\|")*/],
						// "ago": x => ujumi(() => this.agoj.listigi()(eligi_, erari)),
						"ago": x => this.agoj.listigi()(eligi_, erari),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:detaloj|d|\\?)\\s*(\\w+)$")/*, new RegExp("$#(\\w+)")*/],
						"ago": x => this.agoj.detaloj(x[0])(eligi_, erari),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:aktivigi|a|\\+)\\s*(\\w+)$")/*, new RegExp("$\+(\\w+)")*/],
						"ago": x => ujumi(() => this.agoj.sxalti(x[0], true)(eligi_, erari)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:malaktivigi|m|-)\\s*(\\w+)$")/*, new RegExp("$-(\\w+)")*/],
						"ago": x => ujumi(() => this.agoj.sxalti(x[0], false)(eligi_, erari)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:sxalti|s|toggle|t|%)\\s*(\\w+)$")/*, new RegExp("$~(\\w+)")*/],
						"ago": x => ujumi(() => this.agoj.sxalti(x[0])(eligi_, erari)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:resxargi|r|\\$)\\s*(\\w+)$")/*, new RegExp("$#(\\w+)")*/],
						"ago": x => ujumi(() => this.agoj.resxargi(x[0])(eligi_, erari)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:aldoni|\\*)\\s*(\\S+)$")/*, new RegExp("$\*(\\w+)")*/],
						"ago": x => ujumi(() => this.agoj.aldoni(x[0])(eligi_, erari)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:helpo|help|h)$")],
						"ago": x => this.agoj.elmontri_helpon()(eligi_, erari),
					},
				].forEach
				(
					function (ero : Object) : void
					{
						ero["skemoj"].some
						(
							function (skemo : RegExp) : boolean
							{
								let sercxo : any = resto.match(skemo);
								if (sercxo != null)
								{
									ero["ago"](sercxo.slice(1));
									return true;
								}
								else
								{
									return false;
								}
							}
						);
					}
				);
			}
			default:
			{
				break;
			}
		}
	}
	
}