"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_abschluss_ge_AbschlussFaecherGruppe = exports.AbschlussFaecherGruppe = void 0;
const JavaObject_1 = require("../../../java/lang/JavaObject");
const StringBuilder_1 = require("../../../java/lang/StringBuilder");
const Vector_1 = require("../../../java/util/Vector");
const GELeistungsdifferenzierteKursart_1 = require("../../../core/types/ge/GELeistungsdifferenzierteKursart");
const AbschlussManager_1 = require("../../../core/abschluss/AbschlussManager");
class AbschlussFaecherGruppe extends JavaObject_1.JavaObject {
    faecher = new Vector_1.Vector();
    /**
     * Erzeugt eine Fächergruppe aus den angegebenen Fächern und den vorgegebenen Kriterien.
     *
     * @param faecherAlle       eine Liste aller vorhandenen Leistungen
     * @param faecherNutzen     nur die gelisteten Fächer nutzen, null bedeutet grundsätzlich alle benoteten Fächer nutzen (außer den gefilterten)
     * @param faecherFiltern    null bedeutet keinen Filter verwenden, ansonsten werden die gelisteten Fächer gefiltert
     */
    constructor(faecherAlle, faecherNutzen, faecherFiltern) {
        super();
        if (faecherAlle === null)
            return;
        for (let i = 0; i < faecherAlle.size(); i++) {
            let fach = faecherAlle.get(i);
            if (fach.kuerzel === null)
                continue;
            if ((faecherFiltern !== null) && faecherFiltern.contains(fach.kuerzel))
                continue;
            if ((faecherNutzen !== null) && !faecherNutzen.contains(fach.kuerzel))
                continue;
            this.faecher.add(AbschlussManager_1.AbschlussManager.erstelleAbschlussFach(fach.kuerzel, fach.bezeichnung, fach.note, GELeistungsdifferenzierteKursart_1.GELeistungsdifferenzierteKursart.from(fach.kursart), fach.istFremdsprache));
        }
    }
    /**
     * Prüft, ob die gelisteten Fächer in der Fächergruppe sind und nur diese.
     *
     * @param faecherAbgleich   die Fächer, welche in der Fächergruppe sein sollen.
     *
     * @return true, falls die angegebenen Fächer und nur diese in der Fächergruppe sind, ansonsten false.
     */
    istVollstaendig(faecherAbgleich) {
        if (faecherAbgleich === null)
            return true;
        if (this.isEmpty())
            return false;
        for (let kuerzel of faecherAbgleich) {
            if (!this.contains(kuerzel))
                return false;
        }
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (!faecherAbgleich.contains(fach.kuerzel))
                return false;
        }
        return true;
    }
    /**
     * Gibt zurück, ob die Fächergruppe leer ist oder mindestens ein Fach beinhaltet.
     *
     * @return true, falls die Fächergruppe leer ist, ansonsten false
     */
    isEmpty() {
        return (this.faecher === null) || (this.faecher.isEmpty());
    }
    /**
     * Prüft, ob das Fach mit dem angegebenen Fachkürzel in der Fächergruppe enthalten ist
     * oder nicht.
     *
     * @param kuerzel   das Kürzel des Faches, welches geprüft werden soll.
     *
     * @return true, falls das Fach vorhanden ist, und ansonsten false
     */
    contains(kuerzel) {
        if (kuerzel === null)
            return false;
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if ((fach !== null) && (JavaObject_1.JavaObject.equalsTranspiler(fach.kuerzel, (kuerzel))))
                return true;
        }
        return false;
    }
    /**
     * Entfernt alle Fächer aus der Fächergruppe, die dem übergebenen Filter entsprechen.
     *
     * @param filter   die Funktion, um die zu entfernenden Fächer zu bestimmen
     *
     * @return die Liste der tatsächlich entfernten Fächer
     */
    entferneFaecher(filter) {
        let selected = new Vector_1.Vector();
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (filter.test(fach))
                selected.add(fach);
        }
        this.faecher.removeAll(selected);
        return selected;
    }
    /**
     * Bestimmt das Fach, welches dem übergebenen Filter entspricht. Entsprechen
     * mehrere Fächer dem Filterkriterium, so wird nur das erste Fach
     * der internen Liste zurückgegeben.
     *
     * @param filter   die Funktion, die das Kriterium für das gesuchte Fach angibt.
     *
     * @return das Fach, sofern eines gefunden wurde, ansonsten false
     */
    getFach(filter) {
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (filter.test(fach))
                return fach;
        }
        return null;
    }
    /**
     * Bestimmt alle Fächer, welche dem übergebenen Filterkriterium entsprechen.
     *
     * @param filter   die Funktion, die das Kriterium für die gesuchten Fächer angibt.
     *
     * @return eine Liste der Fächer, die dem Filterkriterium entsprechen
     */
    getFaecher(filter) {
        let result = new Vector_1.Vector();
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (filter.test(fach))
                result.add(fach);
        }
        return result;
    }
    /**
     * Gibt die Anzahl der Fächer zurück, welche dem übergebenen Filterkriterium entsprechen.
     *
     * @param filter   die Funktion, die das Kriterium für die gesuchten Fächer angibt.
     *
     * @return die Anzahl der Fächer
     */
    getFaecherAnzahl(filter) {
        let count = 0;
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (filter.test(fach))
                count++;
        }
        return count;
    }
    /**
     * Bestimmt die Kürzel aller Fächer, welche dem übergebenen Filterkriterium entsprechen.
     *
     * @param filter   die Funktion, die das Kriterium für die gesuchten Fächer angibt.
     *
     * @return eine Liste der Kürzel der Fächer, die dem Filterkriterium entsprechen
     */
    getKuerzel(filter) {
        let result = new Vector_1.Vector();
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (filter.test(fach) && (fach.kuerzel !== null))
                result.add(fach.kuerzel);
        }
        return result;
    }
    /**
     * Erstellt eine Zeichenkette mit einer Komma-separierten Liste der Kürzel aller Fächer,
     * welche dem übergebenen Filterkriterium entsprechen.
     *
     * @param filter   die Funktion, die das Kriterium für die gesuchten Fächer angibt.
     *
     * @return die Zeichenkette mit einer Komma-separierten Liste der Fächerkürzel
     */
    getKuerzelListe(filter) {
        let sb = new StringBuilder_1.StringBuilder();
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (filter.test(fach)) {
                if (sb.length() > 0)
                    sb.append(", ");
                sb.append(fach.kuerzel);
            }
        }
        return sb.toString();
    }
    /**
     * Gibt eine Komma-separierte Liste, der Abschlussfächer aus. Dabei wird
     * die toString Methode der Klasse AbschlussFach verwendet.
     */
    toString() {
        let sb = new StringBuilder_1.StringBuilder();
        for (let i = 0; i < this.faecher.size(); i++) {
            let fach = this.faecher.get(i);
            if (sb.length() > 0)
                sb.append(", ");
            let diffkursinfo = "";
            if ((fach.kursart === null) || (fach.kuerzel === null))
                continue;
            if (!GELeistungsdifferenzierteKursart_1.GELeistungsdifferenzierteKursart.Sonstige.hat(fach.kursart))
                diffkursinfo += fach.kursart + ",";
            sb.append(fach.kuerzel + "(" + diffkursinfo.valueOf() + fach.note + ")");
        }
        return sb.toString();
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.abschluss.ge.AbschlussFaecherGruppe'].includes(name);
    }
}
exports.AbschlussFaecherGruppe = AbschlussFaecherGruppe;
function cast_de_nrw_schule_svws_core_abschluss_ge_AbschlussFaecherGruppe(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_abschluss_ge_AbschlussFaecherGruppe = cast_de_nrw_schule_svws_core_abschluss_ge_AbschlussFaecherGruppe;
//# sourceMappingURL=AbschlussFaecherGruppe.js.map