import { JavaObject, cast_java_lang_Object } from '../../../java/lang/JavaObject';
import { JavaInteger, cast_java_lang_Integer } from '../../../java/lang/JavaInteger';
import { Schulform, cast_de_nrw_schule_svws_core_types_statkue_Schulform } from '../../../core/types/statkue/Schulform';
import { List, cast_java_util_List } from '../../../java/util/List';
import { JavaString, cast_java_lang_String } from '../../../java/lang/JavaString';
import { Arrays, cast_java_util_Arrays } from '../../../java/util/Arrays';
import { Vector, cast_java_util_Vector } from '../../../java/util/Vector';

export class Foerderschwerpunkt extends JavaObject {

	/** the name of the enumeration value */
	private readonly __name : String;

	/** the ordinal value for the enumeration value */
	private readonly __ordinal : number;

	/** an array containing all values of this enumeration */
	private static readonly all_values_by_ordinal : Array<Foerderschwerpunkt> = [];

	/** an array containing all values of this enumeration indexed by their name*/
	private static readonly all_values_by_name : Map<String, Foerderschwerpunkt> = new Map<String, Foerderschwerpunkt>();

	public static readonly KEINER : Foerderschwerpunkt = new Foerderschwerpunkt("KEINER", 0, "**", "kein Förderschwerpunkt", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "V", "WB"), null, null);

	public static readonly BL : Foerderschwerpunkt = new Foerderschwerpunkt("BL", 1, "BL", "Sehen (Blinde)", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly EZ : Foerderschwerpunkt = new Foerderschwerpunkt("EZ", 2, "EZ", "Emotionale und soziale Entwicklung", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly GB : Foerderschwerpunkt = new Foerderschwerpunkt("GB", 3, "GB", "Geistige Entwicklung", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly GH : Foerderschwerpunkt = new Foerderschwerpunkt("GH", 4, "GH", "Hören und Kommunikation (Gehörlose)", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "SR", "V"), null, null);

	public static readonly KB : Foerderschwerpunkt = new Foerderschwerpunkt("KB", 5, "KB", "Körperliche und motorische Entwicklung", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "SG", "V"), null, null);

	public static readonly KR : Foerderschwerpunkt = new Foerderschwerpunkt("KR", 6, "KR", "Schule für Kranke", Arrays.asList("FW", "S"), null, null);

	public static readonly LB : Foerderschwerpunkt = new Foerderschwerpunkt("LB", 7, "LB", "Lernen", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly PE : Foerderschwerpunkt = new Foerderschwerpunkt("PE", 8, "PE", "Präventive Förderung im Bereich Emotionale und soziale Entwicklung", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly PF : Foerderschwerpunkt = new Foerderschwerpunkt("PF", 9, "PF", "Präventive Förderung", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly PL : Foerderschwerpunkt = new Foerderschwerpunkt("PL", 10, "PL", "Präventive Förderung im Bereich Lernen", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly PS : Foerderschwerpunkt = new Foerderschwerpunkt("PS", 11, "PS", "Präventive Förderung im Bereich Sprache", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly SB : Foerderschwerpunkt = new Foerderschwerpunkt("SB", 12, "SB", "Sprache", Arrays.asList("FW", "G", "GE", "GM", "GY", "H", "R", "S", "V"), null, null);

	public static readonly SG : Foerderschwerpunkt = new Foerderschwerpunkt("SG", 13, "SG", "Hören und Kommunikation (Schwerhörige)", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "SR", "V"), null, null);

	public static readonly SH : Foerderschwerpunkt = new Foerderschwerpunkt("SH", 14, "SH", "Sehen (Sehbehinderte)", Arrays.asList("BK", "FW", "G", "GE", "GM", "GY", "H", "R", "S", "SB", "V"), null, null);

	public static readonly XX : Foerderschwerpunkt = new Foerderschwerpunkt("XX", 15, "XX", "Kein Förderschwerpunkt", Arrays.asList("SB", "SG"), null, null);

	public readonly kuerzel : String;

	public readonly beschreibung : String;

	public readonly schulformenKuerzel : List<String>;

	private schulformen : Vector<Schulform> | null = null;

	public readonly gueltigVon : Number | null;

	public readonly gueltigBis : Number | null;

	/**
	 * Erzeugt einen neuen Förderschwerpunkt in der Aufzählung.
	 * 
	 * @param kuerzel              das Kürzel, welche im Rahmen der amtlichen Schulstatistik verwendet wird
	 * @param beschreibung         die textuelle Bezeichnung des Förderschwerpunktes
	 * @param schulformenKuerzel   eine Liste mit den Kürzeln der Schulformen, bei denen der Förderschwerpunkt vorkommt
	 */
	private constructor(name : string, ordinal : number, kuerzel : String, beschreibung : String, schulformenKuerzel : List<String>, gueltigVon : Number | null, gueltigBis : Number | null) {
		super();
		this.__name = name;
		this.__ordinal = ordinal;
		Foerderschwerpunkt.all_values_by_ordinal.push(this);
		Foerderschwerpunkt.all_values_by_name.set(name, this);
		this.schulformenKuerzel = schulformenKuerzel;
		this.kuerzel = kuerzel;
		this.beschreibung = beschreibung;
		this.gueltigVon = gueltigVon;
		this.gueltigBis = gueltigBis;
	}

	/**
	 * Liefert alle zulässigen Förderschwerpunkte für die angegeben Schulform.
	 * 
	 * @param schulform   die Schulform
	 * 
	 * @return die bei der Schulform zulässigen Förderschwerpunkte
	 */
	public static get(schulform : Schulform | null) : List<Foerderschwerpunkt> {
		let result : Vector<Foerderschwerpunkt> = new Vector();
		if (schulform === null) 
			return result;
		let foerderschwerpunkte : Array<Foerderschwerpunkt> = Foerderschwerpunkt.values();
		for (let i : number = 0; i < foerderschwerpunkte.length; i++){
			let fs : Foerderschwerpunkt = foerderschwerpunkte[i];
			if (fs.getSchulformen().contains(schulform)) 
				result.add(fs);
		}
		return result;
	}

	/**
	 * Liefert alle Schulformen zurück, bei welchen der Förderschwerpunkt vorkommt.
	 * 
	 * @return eine Liste der Schulformen
	 */
	public getSchulformen() : List<Schulform> {
		if (this.schulformen === null) {
			this.schulformen = new Vector();
			for (let i : number = 0; i < this.schulformenKuerzel.size(); i++){
				let sfKuerzel : String | null = this.schulformenKuerzel.get(i);
				let schulform : Schulform | null = Schulform.getByKuerzel(sfKuerzel);
				if (schulform !== null) 
					this.schulformen.add(schulform);
			}
		}
		return this.schulformen;
	}

	/**
	 * Liefert den Förderschwerpunkt anhand des übergebenen Kürzels zurück.
	 * 
	 * @param kuerzel   das Kürzel des gesuchten Förderschwerpunktes
	 * 
	 * @return der gesuchte Förderschwerpunkt oder null, wenn kein solcher existiert
	 */
	public static getByKuerzel(kuerzel : String | null) : Foerderschwerpunkt | null {
		if ((kuerzel === null) || JavaObject.equalsTranspiler("", (kuerzel))) 
			return null;
		let foerderschwerpunkte : Array<Foerderschwerpunkt> = Foerderschwerpunkt.values();
		for (let i : number = 0; i < foerderschwerpunkte.length; i++){
			let fs : Foerderschwerpunkt = foerderschwerpunkte[i];
			if (JavaObject.equalsTranspiler(fs.kuerzel, (kuerzel))) 
				return fs;
		}
		return null;
	}

	/**
	 * Returns the name of this enumeration value.
	 *
	 * @returns the name
	 */
	private name() : String {
		return this.__name;
	}

	/**
	 * Returns the ordinal value of this enumeration value.
	 *
	 * @returns the ordinal value
	 */
	private ordinal() : number {
		return this.__ordinal;
	}

	/**
	 * Returns the name of this enumeration value.
	 *
	 * @returns the name
	 */
	public toString() : String {
		return this.__name;
	}

	/**
	 * Returns true if this and the other enumeration values are equal.
	 *
	 * @param other   the other enumeration value
	 *
	 * @returns true if they are equal and false otherwise
	 */
	public equals(other : JavaObject) : boolean {
		if (!(other instanceof Foerderschwerpunkt))
			return false;
		return this === other;
	}

	/**
	 * Returns the ordinal value as hashcode, since the ordinal value is unique.
	 *
	 * @returns the ordinal value as hashcode
	 */
	public hashCode() : number {
		return this.__ordinal;
	}

	/**
	 * Compares this enumeration value with the other enumeration value by their ordinal value.
	 *
	 * @param other   the other enumeration value
	 *
	 * @returns a negative, zero or postive value as this enumeration value is less than, equal to
	 *          or greater than the other enumeration value
	 */
	public compareTo(other : Foerderschwerpunkt) : number {
		return this.__ordinal - other.__ordinal;
	}

	/**
	 * Returns an array with enumeration values.
	 *
	 * @returns the array with enumeration values
	 */
	public static values() : Array<Foerderschwerpunkt> {
		return [...this.all_values_by_ordinal];
	}

	/**
	 * Returns the enumeration value with the specified name.
	 *
	 * @param name   the name of the enumeration value
	 *
	 * @returns the enumeration values or null
	 */
	public static valueOf(name : String) : Foerderschwerpunkt | null {
		let tmp : Foerderschwerpunkt | undefined = this.all_values_by_name.get(name);
		return (!tmp) ? null : tmp;
	}

	isTranspiledInstanceOf(name : string): boolean {
		return ['de.nrw.schule.svws.core.types.statkue.Foerderschwerpunkt'].includes(name);
	}

}

export function cast_de_nrw_schule_svws_core_types_statkue_Foerderschwerpunkt(obj : unknown) : Foerderschwerpunkt {
	return obj as Foerderschwerpunkt;
}
