/*
	
	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)=>void;
	malanigxi ?: (kanalo : string)=>void;
	listigi ?: (celo : string)=>void;
	detaloj ?: (identigilo : string, celo : string)=>void;
	sxalti ?: (identigilo : string, aktiva ?: boolean, celo ?: string)=>void;
	resxargi ?: (identigilo : string, celo ?: string)=>void;
	aldoni ?: (nomo : string, celo ?: string)=>void;
	elmontri_helpon ?: (celo ?: string)=>void;
};


/**
 * @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("stirado", "Stirado", "stiras aliajn kromajxojn kaj elmontras informojn pri ili", null, "fenris");
		this.permesuloj = permesuloj;
		this.agoj = agoj;
	}
	
	
	/**
	 * @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",
						}
					}
				);
			}
		}
		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)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kanalo|k)\\s*(?:malanigxi|m|<)\\s*(#\\S+)$")],
						"ago": x => ujumi(() => this.agoj.anigxi(x[0], false)),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:listigi|l)$")/*, new RegExp("$\|")*/],
						"ago": x => this.agoj.listigi(enigo_kruda["parametroj"]["fonto"]),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:detaloj|d|\\?)\\s*(\\w+)$")/*, new RegExp("$#(\\w+)")*/],
						"ago": x => this.agoj.detaloj(x[0], enigo_kruda["parametroj"]["fonto"]),
					},
					{
						"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], undefined, enigo_kruda["parametroj"]["fonto"])),
					},
					{
						"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, enigo_kruda["parametroj"]["fonto"])),
					},
					{
						"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, enigo_kruda["parametroj"]["fonto"])),
					},
					{
						"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], enigo_kruda["parametroj"]["fonto"])),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:kromaĵo|kromajxo|krom|x)\\s*(?:aldoni|\\*)\\s*(\\w+)$")/*, new RegExp("$\*(\\w+)")*/],
						"ago": x => ujumi(() => that.agoj.aldoni(x[0], enigo_kruda["parametroj"]["fonto"])),
					},
					{
						"skemoj": [new RegExp("^!\\s*(?:helpo|help|h)$")],
						"ago": x => this.agoj.elmontri_helpon(enigo_kruda["parametroj"]["fonto"]),
					},
				].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;
			}
		}
	}
	
}