import { JavaObject, cast_java_lang_Object } from '../../../java/lang/JavaObject';
import { GostFachbereich, cast_de_nrw_schule_svws_core_types_gost_GostFachbereich } from '../../../core/types/gost/GostFachbereich';
import { GostFach, cast_de_nrw_schule_svws_core_data_gost_GostFach } from '../../../core/data/gost/GostFach';
import { GostHalbjahr, cast_de_nrw_schule_svws_core_types_gost_GostHalbjahr } from '../../../core/types/gost/GostHalbjahr';
import { JavaString, cast_java_lang_String } from '../../../java/lang/JavaString';

export class GostFachManager extends JavaObject {


	public constructor() {
		super();
	}

	/**
	 * Gibt an, ob es sich bei dem Fach um ein Projektkursfach handelt.
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * 
	 * @return true, falls es sich um ein Projektkursfach handelt
	 */
	public static istProjektkurs(fach : GostFach) : boolean {
		return JavaObject.equalsTranspiler("PX", (fach.kuerzel));
	}

	/**
	 * Gibt an, ob es sich bei dem Fach um ein Vertiefungskursfach handelt.
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * 
	 * @return true, falls es sich um ein Vertiefungskursfach handelt
	 */
	public static istVertiefungskurs(fach : GostFach) : boolean {
		return JavaObject.equalsTranspiler("VX", (fach.kuerzel));
	}

	/**
	 * Gibt an, ob das Fach durchgehend von EF.1 bis Q2.2 belegbar ist;
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * 
	 * @return true, falls es so belegbar ist, sonst false
	 */
	public static istDurchgehendBelegbarBisQ22(fach : GostFach | null) : boolean {
		if (fach === null) 
			return false;
		return fach.istMoeglichEF1 && fach.istMoeglichEF2 && fach.istMoeglichQ11 && fach.istMoeglichQ12 && fach.istMoeglichQ21 && fach.istMoeglichQ22;
	}

	/**
	 * Gibt an, ob das Fach durchgehend von EF.1 bis EF.2 belegbar ist;
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * 
	 * @return true, falls es so belegbar ist, sonst false
	 */
	public static istBelegbarBisEF2(fach : GostFach) : boolean {
		return fach.istMoeglichEF1 && fach.istMoeglichEF2;
	}

	/**
	 * Prüft, ob das Fach zu der angegebenen Sprache gehört
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * @param sprache   das Kürzel der Sprache (1. Zeichen ohne Jahrgang!)
	 * 
	 * @return true, falls das Fach zu der angegebenen Sprache passt, sonst false 
	 */
	public static istFremdsprachenfach(fach : GostFach | null, sprache : String | null) : boolean {
		if ((fach === null) || (fach.kuerzel === null) || (JavaObject.equalsTranspiler("", (fach.kuerzel))) || !GostFachbereich.FREMDSPRACHE.hat(fach) || (sprache === null)) 
			return false;
		return (JavaString.compareToIgnoreCase(sprache, fach.kuerzel.substring(0, 1)) === 0);
	}

	/**
	 * Liefert das Kürzel der Sprache (ohne Jahrgang) zurück, falls es sich um eine Sprache handelt.
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * 
	 * @return das Kürzel der Sprache oder null
	 */
	public static getFremdsprache(fach : GostFach) : String | null {
		if ((fach.kuerzel === null) || (JavaObject.equalsTranspiler("", (fach.kuerzel))) || !GostFachbereich.FREMDSPRACHE.hat(fach)) 
			return null;
		return fach.kuerzel.substring(0, 1).toUpperCase();
	}

	/**
	 * Prüft, ob das Fach bilingual unterrichtet wird oder nicht.
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * 
	 * @return true, falls das Fach bilingual unterrichtet wird.
	 */
	public static istBilingual(fach : GostFach) : boolean {
		return ((fach.biliSprache !== null) && (!JavaObject.equalsTranspiler("", (fach.biliSprache))) && (!JavaObject.equalsTranspiler("D", (fach.biliSprache))));
	}

	/**
	 * Gibt zurück, ob das Fach in dem angegebenen Halbjahr wählbar ist oder nicht.
	 * 
	 * @param fach   das Fach der gymnasialen Oberstufe 
	 * @param halbjahr   das zu prüfende Halbjahr
	 * 
	 * @return true, falls das Fach in dem Halbjahr wählbar ist, sonst false
	 */
	public static istWaehlbar(fach : GostFach | null, halbjahr : GostHalbjahr) : boolean {
		if (fach === null) 
			return false;
		if (halbjahr as unknown === GostHalbjahr.EF1 as unknown) 
			return fach.istMoeglichEF1;
		if (halbjahr as unknown === GostHalbjahr.EF2 as unknown) 
			return fach.istMoeglichEF2;
		if (halbjahr as unknown === GostHalbjahr.Q11 as unknown) 
			return fach.istMoeglichQ11;
		if (halbjahr as unknown === GostHalbjahr.Q12 as unknown) 
			return fach.istMoeglichQ12;
		if (halbjahr as unknown === GostHalbjahr.Q21 as unknown) 
			return fach.istMoeglichQ21;
		if (halbjahr as unknown === GostHalbjahr.Q22 as unknown) 
			return fach.istMoeglichQ22;
		return false;
	}

	isTranspiledInstanceOf(name : string): boolean {
		return ['de.nrw.schule.svws.core.abschluss.gost.GostFachManager'].includes(name);
	}

}

export function cast_de_nrw_schule_svws_core_abschluss_gost_GostFachManager(obj : unknown) : GostFachManager {
	return obj as GostFachManager;
}
