"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynFachart = exports.KursblockungDynFachart = void 0;
const JavaObject_1 = require("../../java/lang/JavaObject");
class KursblockungDynFachart extends JavaObject_1.JavaObject {
    nr;
    representation;
    kursArr;
    schuelerMax = 0;
    kurseMax = 0;
    schuelerAnzNow = 0;
    statistik;
    /**
     * @param pNr             Eine laufende Nummer (ID) für alle Facharten.
     * @param pRepresentation Eine String-Darstellung der Fachart, z.B. 'D;LK'.
     * @param pStatistik      Dem Statistik-Objekt wird eine Veränderung der
     *                        Kursdifferenz mitgeteilt.
     */
    constructor(pNr, pRepresentation, pStatistik) {
        super();
        this.nr = pNr;
        this.representation = pRepresentation;
        this.statistik = pStatistik;
        this.kursArr = Array(0).fill(null);
        this.kurseMax = 0;
        this.schuelerMax = 0;
        this.schuelerAnzNow = 0;
    }
    /**
     * Durch das Überschreiben dieser Methode, liefert dieses Objekt eine
     * automatische String-Darstellung, beispielsweise 'D;LK'.
     */
    toString() {
        return this.representation;
    }
    /**
     * Liefert die Nummer dieser Fachart.
     *
     * @return Die Nummer dieser Fachart.
     */
    gibNr() {
        return this.nr;
    }
    /**
     * Liefert die maximale Anzahl ({@link #schuelerMax}) an SuS, die dieser Fachart
     * zugeordnet sein können. Das ist die Anzahl der Fachwahlen.
     *
     * @return Die Anzahl der SuS, die diese Fachart gewählt haben.
     */
    gibSchuelerMax() {
        return this.schuelerMax;
    }
    /**
     * Liefert die aktuelle Anzahl ({@link #schuelerAnzNow}) an SuS, die dieser
     * Fachart zugeordnet sind.
     *
     * @return Die Anzahl der SuS, die diese Fachart aktuell zugeordnet sind.
     */
    gibSchuelerZordnungen() {
        return this.schuelerAnzNow;
    }
    /**
     * Liefert die Anzahl der Kurse die dieser Fachart zugeordnet sind.
     *
     * @return Die Anzahl der Kurse die dieser Fachart zugeordnet sind.
     */
    gibKurseMax() {
        return this.kurseMax;
    }
    /**
     * Liefert die aktuell größte Kursdifferenz.
     *
     * @return Die aktuell größte Kursdifferenz.
     */
    gibKursdifferenz() {
        return this.kursArr[this.kursArr.length - 1].gibSchuelerAnzahl() - this.kursArr[0].gibSchuelerAnzahl();
    }
    /**
     * Liefert das Array aller Kurse dieser Fachart.
     *
     * @return Das Array aller Kurse dieser Fachart.
     */
    gibKurse() {
        return this.kursArr;
    }
    /**
     * Ordnet alle Kurse der Fachart zu. Die Kurse haben noch keine SuS und sind
     * somit automatisch sortiert.
     *
     * @param pKursArr Alle Kurse der Fachart.
     */
    aktionSetKurse(pKursArr) {
        this.kursArr = pKursArr;
    }
    /**
     * Erhöht die Anzahl ({@link #schuelerMax}) an SuS, die diese Fachart gewählt
     * haben um 1.
     */
    aktionMaxSchuelerErhoehen() {
        this.schuelerMax++;
    }
    /**
     * Erhöht die Anzahl ({@link #kurseMax}) an Kursen, die zu dieser Fachart
     * gehören.
     */
    aktionMaxKurseErhoehen() {
        this.kurseMax++;
    }
    /**
     * Muss aufgerufen werden, bevor die Schüleranzahl eines Kurses verändert wird.
     */
    aktionKursdifferenzEntfernen() {
        this.statistik.aktionKursdifferenzEntfernen(this.gibKursdifferenz());
    }
    /**
     * Muss aufgerufen werden, nachdem die Schüleranzahl eines Kurses verändert
     * wird.
     */
    aktionKursdifferenzHinzufuegen() {
        this.statistik.aktionKursdifferenzHinzufuegen(this.gibKursdifferenz());
    }
    /**
     * Erhöht die Anzahl ({@link #schuelerAnzNow}) an Schülern, die dieser Fachart
     * momentan zugeordnet sind um 1. Die Aufru
     */
    aktionSchuelerWurdeHinzugefuegt() {
        this.schuelerAnzNow++;
        for (let i = 1; i < this.kursArr.length; i++) {
            let kursL = this.kursArr[i - 1];
            let kursR = this.kursArr[i];
            if (kursL.gibSchuelerAnzahl() > kursR.gibSchuelerAnzahl()) {
                this.kursArr[i - 1] = kursR;
                this.kursArr[i] = kursL;
            }
        }
    }
    /**
     * Verringert die Anzahl ({@link #schuelerAnzNow}) an SuS, die dieser Fachart
     * momentan zugeordnet sind um 1.
     */
    aktionSchuelerWurdeEntfernt() {
        this.schuelerAnzNow--;
        for (let i = this.kursArr.length - 1; i >= 1; i--) {
            let kursL = this.kursArr[i - 1];
            let kursR = this.kursArr[i];
            if (kursL.gibSchuelerAnzahl() > kursR.gibSchuelerAnzahl()) {
                this.kursArr[i - 1] = kursR;
                this.kursArr[i] = kursL;
            }
        }
    }
    /**
     * Debug Ausgabe. Nur für Testzwecke.
     */
    debug() {
        for (let i = 0; i < this.kursArr.length; i++) {
            console.log(JSON.stringify("    " + this.kursArr[i] + " --> " + this.kursArr[i].gibSchuelerAnzahl() + " SuS."));
        }
    }
    /**
     * Liefert TRUE, falls mindestens ein Kurs dieser Fachart ein Multikur ist.
     *
     * @return TRUE, falls mindestens ein Kurs dieser Fachart ein Multikur ist.
     */
    gibHatMultikurs() {
        for (let kurs of this.kursArr) {
            if (kurs.gibSchienenAnzahl() > 1) {
                return true;
            }
        }
        return false;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.kursblockung.KursblockungDynFachart'].includes(name);
    }
}
exports.KursblockungDynFachart = KursblockungDynFachart;
function cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynFachart(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynFachart = cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynFachart;
//# sourceMappingURL=KursblockungDynFachart.js.map