"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_KurszahlenUndWochenstunden = exports.KurszahlenUndWochenstunden = void 0;
const JavaObject_1 = require("../../../../java/lang/JavaObject");
const HashMap_1 = require("../../../../java/util/HashMap");
const GostBelegpruefung_1 = require("../../../../core/abschluss/gost/GostBelegpruefung");
const GostKursart_1 = require("../../../../core/types/gost/GostKursart");
const Projektkurse_1 = require("../../../../core/abschluss/gost/belegpruefung/Projektkurse");
const GostFachbereich_1 = require("../../../../core/types/gost/GostFachbereich");
const NullPointerException_1 = require("../../../../java/lang/NullPointerException");
const Note_1 = require("../../../../core/types/Note");
const GostHalbjahr_1 = require("../../../../core/types/gost/GostHalbjahr");
const GostBelegungsfehler_1 = require("../../../../core/abschluss/gost/GostBelegungsfehler");
class KurszahlenUndWochenstunden extends GostBelegpruefung_1.GostBelegpruefung {
    kurszahlen = null;
    kurszahlenGrundkurse = null;
    kurszahlenLeistungskurse = null;
    kurszahlenAnrechenbar = null;
    kurszahlenEinfuehrungsphase = null;
    kurszahlenQualifikationsphase = null;
    blockIAnzahlGrundkurse = 0;
    anzahlLKFaecher = 0;
    blockIAnzahlLeistungskurse = 0;
    blockIAnzahlAnrechenbar = 0;
    wochenstunden = null;
    wochenstundenEinfuehrungsphase = 0;
    wochenstundenQualifikationsphase = 0;
    /**
     * Erstellt eine neue Belegprüfung für die Kurszahlen.
     *
     * @param manager                 der Daten-Manager für die Abiturdaten
     * @param pruefungs_art           die Art der durchzuführenden Prüfung (z.B. EF.1 oder GESAMT)
     * @param pruefungProjektkurse    das Ergebnis für die Belegprüfung der Projektkurse
     */
    constructor(manager, pruefungs_art, pruefungProjektkurse) {
        super(manager, pruefungs_art, pruefungProjektkurse);
    }
    init() {
        this.kurszahlen = new HashMap_1.HashMap();
        this.kurszahlenGrundkurse = new HashMap_1.HashMap();
        this.kurszahlenLeistungskurse = new HashMap_1.HashMap();
        this.kurszahlenAnrechenbar = new HashMap_1.HashMap();
        this.kurszahlenEinfuehrungsphase = new HashMap_1.HashMap();
        this.kurszahlenQualifikationsphase = new HashMap_1.HashMap();
        this.blockIAnzahlGrundkurse = 0;
        this.anzahlLKFaecher = 0;
        this.blockIAnzahlLeistungskurse = 0;
        this.blockIAnzahlAnrechenbar = 0;
        this.wochenstunden = new HashMap_1.HashMap();
        this.wochenstundenEinfuehrungsphase = 0;
        this.wochenstundenQualifikationsphase = 0;
        let projektkurse = ((0, Projektkurse_1.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Projektkurse)(this.pruefungen_vorher[0]));
        let kursarten = GostKursart_1.GostKursart.values();
        for (let halbjahr of GostHalbjahr_1.GostHalbjahr.values()) {
            let kurszahlenHalbjahr = new HashMap_1.HashMap();
            this.kurszahlen.put(halbjahr, kurszahlenHalbjahr);
            for (let kursart of kursarten) {
                kurszahlenHalbjahr.put(kursart, 0);
            }
            this.kurszahlenGrundkurse.put(halbjahr, 0);
            this.kurszahlenLeistungskurse.put(halbjahr, 0);
            this.kurszahlenAnrechenbar.put(halbjahr, 0);
            this.wochenstunden.put(halbjahr, 0);
        }
        for (let kursart of kursarten) {
            this.kurszahlenEinfuehrungsphase.put(kursart, 0);
            this.kurszahlenQualifikationsphase.put(kursart, 0);
        }
        let alleFachbelegungen = this.manager.getFachbelegungen();
        for (let i = 0; i < alleFachbelegungen.size(); i++) {
            let fachbelegung = alleFachbelegungen.get(i);
            let fach = this.manager.getFach(fachbelegung);
            let istLKFach = false;
            for (let fachbelegungHalbjahr of fachbelegung.belegungen) {
                if (fachbelegungHalbjahr === null)
                    continue;
                if (GostFachbereich_1.GostFachbereich.SPORT.hat(fach) && JavaObject_1.JavaObject.equalsTranspiler(Note_1.Note.ATTEST, (Note_1.Note.fromKuerzel(fachbelegungHalbjahr.notenkuerzel))))
                    continue;
                let halbjahr = GostHalbjahr_1.GostHalbjahr.fromKuerzel(fachbelegungHalbjahr.halbjahrKuerzel);
                if (halbjahr === null)
                    continue;
                let kursart = GostKursart_1.GostKursart.fromKuerzel(fachbelegungHalbjahr.kursartKuerzel);
                if (kursart === null)
                    continue;
                let kurszahlenHalbjahr = this.kurszahlen.get(halbjahr);
                if (kurszahlenHalbjahr === null)
                    kurszahlenHalbjahr = new HashMap_1.HashMap();
                let kurszahlAlt = kurszahlenHalbjahr.get(kursart);
                kurszahlenHalbjahr.put(kursart, kurszahlAlt === null ? 1 : kurszahlAlt.valueOf() + 1);
                if ((kursart === GostKursart_1.GostKursart.GK) || (halbjahr.istQualifikationsphase() && ((kursart === GostKursart_1.GostKursart.ZK) || ((kursart === GostKursart_1.GostKursart.PJK) && (projektkurse.istAnrechenbar(fachbelegungHalbjahr)))))) {
                    let kurszahlGK = this.kurszahlenGrundkurse.get(halbjahr);
                    this.kurszahlenGrundkurse.put(halbjahr, kurszahlGK === null ? 1 : kurszahlGK.valueOf() + 1);
                    let kurszahlAnrechenbar = this.kurszahlenAnrechenbar.get(halbjahr);
                    this.kurszahlenAnrechenbar.put(halbjahr, kurszahlAnrechenbar === null ? 1 : kurszahlAnrechenbar.valueOf() + 1);
                    if (halbjahr.istQualifikationsphase()) {
                        this.blockIAnzahlGrundkurse++;
                        this.blockIAnzahlAnrechenbar++;
                    }
                }
                if (halbjahr.istQualifikationsphase() && (kursart === GostKursart_1.GostKursart.LK)) {
                    istLKFach = true;
                    let kurszahlLK = this.kurszahlenLeistungskurse.get(halbjahr);
                    this.kurszahlenLeistungskurse.put(halbjahr, kurszahlLK === null ? 1 : kurszahlLK.valueOf() + 1);
                    let kurszahlAnrechenbar = this.kurszahlenAnrechenbar.get(halbjahr);
                    this.kurszahlenAnrechenbar.put(halbjahr, kurszahlAnrechenbar === null ? 1 : kurszahlAnrechenbar.valueOf() + 1);
                    this.blockIAnzahlLeistungskurse++;
                    this.blockIAnzahlAnrechenbar++;
                }
                let stunden = 0;
                switch (kursart.kuerzel) {
                    case "GK":
                        stunden = ((fach !== null) && fach.istFremdSpracheNeuEinsetzend) ? 4 : 3;
                        break;
                    case "LK":
                        stunden = 5;
                        break;
                    case "PJK":
                        stunden = (fachbelegungHalbjahr.wochenstunden === 3) ? 3 : 2;
                        break;
                    case "VTF":
                        stunden = 2;
                        break;
                    case "ZK":
                        stunden = 3;
                        break;
                }
                let wochenstundenAlt = this.wochenstunden.get(halbjahr);
                this.wochenstunden.put(halbjahr, wochenstundenAlt === null ? stunden : wochenstundenAlt.valueOf() + stunden);
                if (halbjahr.istEinfuehrungsphase()) {
                    let kurszahlEF = this.kurszahlenEinfuehrungsphase.get(kursart);
                    this.kurszahlenEinfuehrungsphase.put(kursart, kurszahlEF === null ? 1 : kurszahlEF.valueOf() + 1);
                    this.wochenstundenEinfuehrungsphase += stunden;
                }
                else {
                    let kurszahlQ = this.kurszahlenQualifikationsphase.get(kursart);
                    this.kurszahlenQualifikationsphase.put(kursart, kurszahlQ === null ? 1 : kurszahlQ.valueOf() + 1);
                    this.wochenstundenQualifikationsphase += stunden;
                }
            }
            if (istLKFach)
                this.anzahlLKFaecher++;
        }
    }
    pruefeEF1() {
        this.pruefeGrundkurseEF1();
        this.pruefeWochenstundenEF1();
    }
    /**
     * EF1-Prüfung Punkt 21:
     * Prüfe, ob zu wenige Grundkurse (ohne Vertiefungskurse) in der EF belegt wurden,
     * dh. weniger als 10 Kurse
     */
    pruefeGrundkurseEF1() {
        if (this.kurszahlenGrundkurse === null)
            throw new NullPointerException_1.NullPointerException();
        let kurszahlGK = this.kurszahlenGrundkurse.get(GostHalbjahr_1.GostHalbjahr.EF1);
        if ((kurszahlGK === null) || (kurszahlGK < 10))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ANZ_10);
    }
    /**
     * EF1-Prüfung Punkt 22:
     * Prüfe, ob die Summe der Kursstunden in der EF.1 größer oder gleich 32 und kleiner oder gleich 36 ist.
     */
    pruefeWochenstundenEF1() {
        if (this.wochenstunden === null)
            throw new NullPointerException_1.NullPointerException();
        let stunden = this.wochenstunden.get(GostHalbjahr_1.GostHalbjahr.EF1);
        if ((stunden === null) || (stunden < 32) || (stunden > 36))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ANZ_11_INFO);
    }
    pruefeGesamt() {
        this.pruefeGrundkurseEF();
        this.pruefeGrundkurseQ();
        this.pruefeLeistungskurse();
        this.pruefeVertiefungskurseEF();
        this.pruefeWochenstunden();
        this.pruefeVertiefungskurseQ();
        this.pruefeAnrechenbareKurse();
        this.pruefeKursstundenSummen();
    }
    /**
     * Gesamtprüfung Punkt 58:
     * Prüfe, ob zu wenige Grundkurse (ohne Vertiefungskurse) in der EF belegt wurden,
     * dh. weniger als 10 Kurse
     */
    pruefeGrundkurseEF() {
        if (this.kurszahlenGrundkurse === null)
            throw new NullPointerException_1.NullPointerException();
        let kurszahlGK_EF1 = this.kurszahlenGrundkurse.get(GostHalbjahr_1.GostHalbjahr.EF1);
        let kurszahlGK_EF2 = this.kurszahlenGrundkurse.get(GostHalbjahr_1.GostHalbjahr.EF2);
        if ((kurszahlGK_EF1 === null) || (kurszahlGK_EF1 < 10) || (kurszahlGK_EF2 === null) || (kurszahlGK_EF2 < 10))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ANZ_10);
    }
    /**
     * Gesamtprüfung Punkt 59:
     * Prüfe, ob in jedem Halbjahr die Summe der Kursstunden größer oder gleich 32 und kleiner oder gleich 36 ist.
     */
    pruefeWochenstunden() {
        if (this.wochenstunden === null)
            throw new NullPointerException_1.NullPointerException();
        for (let halbjahr of GostHalbjahr_1.GostHalbjahr.values()) {
            let stunden = this.wochenstunden.get(halbjahr);
            if ((stunden === null) || (stunden < 32) || (stunden > 36))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ANZ_11_INFO);
        }
    }
    /**
     * Gesamtprüfung Punkt 61:
     * Prüfe, ob in den Halbjahren der Qualifikationsphase mindestens 7 Grundkurse belegt wurden.
     * Dazu zählen auch Zusatzkurse sowie solche Projektkurse, die 2 Halbjahre belegt wurden
     * und zu keiner besonderen Lernleistung zählen.
     */
    pruefeGrundkurseQ() {
        if (this.kurszahlenGrundkurse === null)
            throw new NullPointerException_1.NullPointerException();
        for (let halbjahr of GostHalbjahr_1.GostHalbjahr.getQualifikationsphase()) {
            let kurszahlGK = this.kurszahlenGrundkurse.get(halbjahr);
            if ((kurszahlGK === null) || (kurszahlGK < 7))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GKS_10);
        }
    }
    /**
     * Gesamtprüfung Punkt 60 und 75:
     * Wurden in der Qualifikationsphase in jedem Halbjahr zwei LKs belegt in insgesamt genau 2 Fächern.
     */
    pruefeLeistungskurse() {
        if (this.anzahlLKFaecher !== 2)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.LK_10);
        if (this.kurszahlenLeistungskurse === null)
            throw new NullPointerException_1.NullPointerException();
        for (let halbjahr of GostHalbjahr_1.GostHalbjahr.getQualifikationsphase()) {
            let kurszahlLK = this.kurszahlenLeistungskurse.get(halbjahr);
            if ((kurszahlLK !== null) && (kurszahlLK > 2))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.LK_11);
        }
    }
    /**
     * Gesamtprüfung Punkt 62:
     * Ist die Summe aller belegten Vertiefungskurse in der EF kleiner gleich 4?
     */
    pruefeVertiefungskurseEF() {
        if (this.kurszahlenEinfuehrungsphase === null)
            throw new NullPointerException_1.NullPointerException();
        let kurszahlEF_VTF = this.kurszahlenEinfuehrungsphase.get(GostKursart_1.GostKursart.VTF);
        if ((kurszahlEF_VTF !== null) && (kurszahlEF_VTF > 4))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.VF_10);
    }
    /**
     * Gesamtprüfung Punkt 63:
     * Ist die Summe aller belegten Vertiefungskurse in der Qualifikationsphase kleiner gleich 2?
     */
    pruefeVertiefungskurseQ() {
        if (this.kurszahlenQualifikationsphase === null)
            throw new NullPointerException_1.NullPointerException();
        let kurszahlQ_VTF = this.kurszahlenQualifikationsphase.get(GostKursart_1.GostKursart.VTF);
        if ((kurszahlQ_VTF !== null) && (kurszahlQ_VTF > 2))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.VF_11);
    }
    /**
     * Gesamtprüfung Punkt 69:
     * Ist die Anzahl anrechenbarer Kurse für Block I des Abiturs (Qualifikationsphase) größer gleich 38?
     */
    pruefeAnrechenbareKurse() {
        if (this.blockIAnzahlAnrechenbar < 38)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ANZ_12);
    }
    /**
     * Gesamtprüfung Punkte 80-82:
     * Prüfe, ob die Summe der durschnittlichen Kursstunden der 3 Jahre größer oder gleich 100 bzw. 102 ist
     * und ob die durchschnittliche Summe der Kurstunden in der Einführungsphase under Qualifikationsphase
     * größer oder gleich 34 ist.
     */
    pruefeKursstundenSummen() {
        if (this.wochenstundenEinfuehrungsphase / 2.0 < 34.0)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.WST_20);
        if (this.wochenstundenQualifikationsphase / 4.0 < 34.0)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.WST_21);
        let summeKursstundenDurchschnitte = (this.wochenstundenEinfuehrungsphase / 2.0) + (this.wochenstundenQualifikationsphase / 4.0) * 2.0;
        if (summeKursstundenDurchschnitte < 102) {
            if (summeKursstundenDurchschnitte < 100) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.STD_10);
            }
            else {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.STD_11_INFO);
            }
        }
    }
    /**
     * Gibt die Kurszahlen für das Halbjahr und die Kursart zurück.
     *
     * @param halbjahr   das Halbjahr
     * @param kursart    die Kursart
     *
     * @return die Kurszahlen
     */
    getKurszahlen(halbjahr, kursart) {
        if (this.kurszahlen === null)
            return 0;
        let kurszahlenHalbjahr = this.kurszahlen.get(halbjahr);
        if (kurszahlenHalbjahr === null)
            return 0;
        let kurszahl = kurszahlenHalbjahr.get(kursart);
        if (kurszahl === null)
            return 0;
        return kurszahl.valueOf();
    }
    /**
     * Gibt die Kurszahlen für die Grundkurse für das angegebene Halbjahr zurück.
     *
     * @param halbjahr   das Halbjahr
     *
     * @return die Kurszahlen
     */
    getKurszahlenGrundkurse(halbjahr) {
        if (this.kurszahlenGrundkurse === null)
            return 0;
        let kurszahl = this.kurszahlenGrundkurse.get(halbjahr);
        if (kurszahl === null)
            return 0;
        return kurszahl.valueOf();
    }
    /**
     * Gibt die Kurszahlen für die Leistungskurse für das angegebene Halbjahr zurück.
     *
     * @param halbjahr   das Halbjahr
     *
     * @return die Kurszahlen
     */
    getKurszahlenLeistungskurse(halbjahr) {
        if (this.kurszahlenLeistungskurse === null)
            return 0;
        let kurszahl = this.kurszahlenLeistungskurse.get(halbjahr);
        if (kurszahl === null)
            return 0;
        return kurszahl.valueOf();
    }
    /**
     * Gibt die Zahl der anrechenbaren Kurse für das angegebene Halbjahr zurück.
     *
     * @param halbjahr   das Halbjahr
     *
     * @return die Kurszahlen
     */
    getKurszahlenAnrechenbar(halbjahr) {
        if (this.kurszahlenAnrechenbar === null)
            return 0;
        let kurszahl = this.kurszahlenAnrechenbar.get(halbjahr);
        if (kurszahl === null)
            return 0;
        return kurszahl.valueOf();
    }
    /**
     * Gibt die Zahl der Kurse mit der angegebenen Kursart in der Einführungsphase zurück.
     *
     * @param kursart   die Kursart
     *
     * @return die Kurszahlen
     */
    getKurszahlenEinfuehrungsphase(kursart) {
        if (this.kurszahlenEinfuehrungsphase === null)
            return 0;
        let kurszahl = this.kurszahlenEinfuehrungsphase.get(kursart);
        if (kurszahl === null)
            return 0;
        return kurszahl.valueOf();
    }
    /**
     * Gibt die Zahl der Kurse mit der angegebenen Kursart in der Qualifikationsphase zurück.
     *
     * @param kursart   die Kursart
     *
     * @return die Kurszahlen
     */
    getKurszahlenQualifikationsphase(kursart) {
        if (this.kurszahlenQualifikationsphase === null)
            return 0;
        let kurszahl = this.kurszahlenQualifikationsphase.get(kursart);
        if (kurszahl === null)
            return 0;
        return kurszahl.valueOf();
    }
    /**
     * Gibt die Anzahl der Grundkurse für Block I zurück.
     *
     * @return die Anzahl der Grundkurse
     */
    getBlockIAnzahlGrundkurse() {
        return this.blockIAnzahlGrundkurse;
    }
    /**
     * Gibt die Anzahl der Leistungskurse für Block I zurück.
     *
     * @return die Anzahl der Leistungskurse
     */
    getBlockIAnzahlLeistungskurse() {
        return this.blockIAnzahlLeistungskurse;
    }
    /**
     * Gibt die Anzahl der anrechenbaren Kurse für Block I zurück.
     *
     * @return die Anzahl der anrechenbaren Kurse
     */
    getBlockIAnzahlAnrechenbar() {
        return this.blockIAnzahlAnrechenbar;
    }
    /**
     * Gibt die Anzahl der Wochenstunden für das angegebene Halbjahr zurück.
     *
     * @param halbjahr  das Halbjahr
     *
     * @return die Anzahl der Wochenstunden
     */
    getWochenstunden(halbjahr) {
        if (this.wochenstunden === null)
            return 0;
        let stunden = this.wochenstunden.get(halbjahr);
        if (stunden === null)
            stunden = 0;
        return stunden.valueOf();
    }
    /**
     * Gibt die Anzahl der Wochenstunden für die Einführungsphase zurück.
     *
     * @return die Anzahl der Wochenstunden
     */
    getWochenstundenEinfuehrungsphase() {
        return this.wochenstundenEinfuehrungsphase;
    }
    /**
     * Gibt die Anzahl der Wochenstunden für die Qualifikationsphase zurück.
     *
     * @return die Anzahl der Wochenstunden
     */
    getWochenstundenQualifikationsphase() {
        return this.wochenstundenQualifikationsphase;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.abschluss.gost.GostBelegpruefung', 'de.nrw.schule.svws.core.abschluss.gost.belegpruefung.KurszahlenUndWochenstunden'].includes(name);
    }
}
exports.KurszahlenUndWochenstunden = KurszahlenUndWochenstunden;
function cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_KurszahlenUndWochenstunden(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_KurszahlenUndWochenstunden = cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_KurszahlenUndWochenstunden;
//# sourceMappingURL=KurszahlenUndWochenstunden.js.map