import { JavaObject, cast_java_lang_Object } from '../../java/lang/JavaObject';
import { JavaBoolean, cast_java_lang_Boolean } from '../../java/lang/JavaBoolean';
import { Abschluss, cast_de_nrw_schule_svws_core_types_Abschluss } from '../../core/types/Abschluss';
import { BKAnlageAFach, cast_de_nrw_schule_svws_core_abschluss_bk_a_BKAnlageAFach } from '../../core/abschluss/bk/a/BKAnlageAFach';
import { AbschlussErgebnisBerufsbildend, cast_de_nrw_schule_svws_core_data_abschluss_AbschlussErgebnisBerufsbildend } from '../../core/data/abschluss/AbschlussErgebnisBerufsbildend';
import { JavaDouble, cast_java_lang_Double } from '../../java/lang/JavaDouble';
import { BKAnlageAFaecher, cast_de_nrw_schule_svws_core_abschluss_bk_a_BKAnlageAFaecher } from '../../core/abschluss/bk/a/BKAnlageAFaecher';

export class AbschlussManagerBerufsbildend extends JavaObject {


	public constructor() {
		super();
	}

	/**
	 * Erzeugt ein Ergebnis der Abschlussberechnung unter Angabe, ob dieser erworben 
	 * wurde. Die Liste der Nachprüfungsfächer ist leer und ein Log ist nicht zugeordnet.
	 *  
	 * @param hatBSA                      ist der Berufsschulabschluss erreicht
	 * @param note                        Note des Abschlusses
	 * @param hatBA                       ist der Berufsabschluss erreicht
	 * @param abschlussAllgemeinbildend   der allgemeinbildende Abschluss
	 * 
	 * @return das Ergebnis der Abschlussberechnung 
	 */
	public static getErgebnis(hatBSA : boolean, note : number, hatBA : Boolean | null, abschlussAllgemeinbildend : Abschluss | null) : AbschlussErgebnisBerufsbildend {
		let ergebnis : AbschlussErgebnisBerufsbildend = new AbschlussErgebnisBerufsbildend();
		ergebnis.hatBSA = hatBSA;
		ergebnis.note = note;
		ergebnis.hatBA = hatBA;
		ergebnis.abschlussAllgemeinbildend = (abschlussAllgemeinbildend === null) ? null : abschlussAllgemeinbildend.toString();
		ergebnis.log = null;
		return ergebnis;
	}

	/**
	 * Berechnet den Notendurchschnitt aller Fächer
	 * 
	 * @param abschluss_faecher   die Fächer für die Abschlussberechnung
	 * 
	 * @return der Notendurchschnitt oder NaN im Fehlerfall
	 */
	public static getDurchschnitt(abschluss_faecher : BKAnlageAFaecher) : number {
		if ((abschluss_faecher.faecher === null) || (abschluss_faecher.faecher.size() === 0)) 
			return NaN;
		let sum : number = 0;
		for (let fach of abschluss_faecher.faecher) {
			sum += fach.note;
		}
		return (sum as number) / abschluss_faecher.faecher.size();
	}

	/**
	 * Berechnet die Anzahl der Defizite 
	 * 
	 * @param abschluss_faecher   die Fächer für die Abschlussberechnung
	 * 
	 * @return die Anzahl der Defizite oder -1 im Fehlerfall
	 */
	public static getAnzahlDefizite(abschluss_faecher : BKAnlageAFaecher) : number {
		if ((abschluss_faecher.faecher === null) || (abschluss_faecher.faecher.size() === 0)) 
			return -1;
		let sum : number = 0;
		for (let fach of abschluss_faecher.faecher) {
			if (fach.note >= 5) 
				sum++;
		}
		return sum;
	}

	/**
	 * Berechnet die Anzahl der Note Ungenügend 
	 * 
	 * @param abschluss_faecher   die Fächer für die Abschlussberechnung
	 * 
	 * @return die Anzahl der Note Ungenügend oder -1 im Fehlerfall
	 */
	public static getAnzahlUngenuegend(abschluss_faecher : BKAnlageAFaecher) : number {
		if ((abschluss_faecher.faecher === null) || (abschluss_faecher.faecher.size() === 0)) 
			return -1;
		let sum : number = 0;
		for (let fach of abschluss_faecher.faecher) {
			if (fach.note >= 6) 
				sum++;
		}
		return sum;
	}

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

}

export function cast_de_nrw_schule_svws_core_abschluss_AbschlussManagerBerufsbildend(obj : unknown) : AbschlussManagerBerufsbildend {
	return obj as AbschlussManagerBerufsbildend;
}
