"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Projektkurse = exports.Projektkurse = void 0;
const JavaObject_1 = require("../../../../java/lang/JavaObject");
const GostBelegpruefung_1 = require("../../../../core/abschluss/gost/GostBelegpruefung");
const GostFachManager_1 = require("../../../../core/abschluss/gost/GostFachManager");
const GostKursart_1 = require("../../../../core/types/gost/GostKursart");
const GostHalbjahr_1 = require("../../../../core/types/gost/GostHalbjahr");
const Vector_1 = require("../../../../java/util/Vector");
const GostBelegungsfehler_1 = require("../../../../core/abschluss/gost/GostBelegungsfehler");
const HashSet_1 = require("../../../../java/util/HashSet");
class Projektkurse extends GostBelegpruefung_1.GostBelegpruefung {
    projektkursBelegung = null;
    projektkurs = null;
    projektkursHalbjahre = null;
    /**
     * Erstellt eine neue Belegprüfung für die Projektkurse.
     *
     * @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)
     */
    constructor(manager, pruefungs_art) {
        super(manager, pruefungs_art);
    }
    init() {
        this.projektkurs = null;
        this.projektkursBelegung = new Vector_1.Vector();
        this.projektkursHalbjahre = new Vector_1.Vector();
        let alleFachbelegungen = this.manager.getFachbelegungen();
        for (let i = 0; i < alleFachbelegungen.size(); i++) {
            let fachbelegung = alleFachbelegungen.get(i);
            if (this.manager.zaehleBelegung(fachbelegung) <= 0)
                continue;
            let fach = this.manager.getFach(fachbelegung);
            if ((fach !== null) && GostFachManager_1.GostFachManager.istProjektkurs(fach)) {
                this.projektkursBelegung.add(fachbelegung);
            }
        }
    }
    pruefeEF1() {
        this.pruefeBelegungEF();
    }
    pruefeGesamt() {
        this.pruefeBelegungEF();
        this.pruefeAufAnrechenbarenProjektkurs();
        this.pruefeBelegungHalbjahre();
        this.pruefeBelegungLeitfaecher();
        if (this.manager.istProjektKursBesondereLernleistung())
            this.addFehler((this.projektkurs !== null) ? GostBelegungsfehler_1.GostBelegungsfehler.PF_16_INFO : GostBelegungsfehler_1.GostBelegungsfehler.PF_15);
    }
    /**
     * Prüft, ob ein Projektfach in der EF belegt wurde. Eine solche Belegung ist nicht zulässig.
     */
    pruefeBelegungEF() {
        if (this.projektkursBelegung === null)
            return;
        for (let fachbelegung of this.projektkursBelegung) {
            for (let belegungHalbjahr of fachbelegung.belegungen) {
                if (belegungHalbjahr === null)
                    continue;
                let halbjahr = GostHalbjahr_1.GostHalbjahr.fromKuerzel(belegungHalbjahr.halbjahrKuerzel);
                if ((halbjahr === GostHalbjahr_1.GostHalbjahr.EF1) || (halbjahr === GostHalbjahr_1.GostHalbjahr.EF2))
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.PF_10);
            }
        }
    }
    /**
     * Prüft, ob ein anrechenbarer Projektkurs unter den belegten Projektfächern existiert. Es darf aber
     * auch nur genau ein anrechenbarer Projektkurs existieren!
     */
    pruefeAufAnrechenbarenProjektkurs() {
        if (this.projektkursBelegung === null)
            return;
        for (let fachbelegung of this.projektkursBelegung) {
            for (let belegungHalbjahr of fachbelegung.belegungen) {
                if (belegungHalbjahr === null)
                    continue;
                let halbjahr = GostHalbjahr_1.GostHalbjahr.fromKuerzel(belegungHalbjahr.halbjahrKuerzel);
                if (halbjahr === null)
                    continue;
                if ((halbjahr === GostHalbjahr_1.GostHalbjahr.EF1) || (halbjahr === GostHalbjahr_1.GostHalbjahr.EF2))
                    continue;
                let nextHalbjahr = halbjahr.next();
                if (nextHalbjahr === null) {
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.PF_18);
                    continue;
                }
                else if (!this.manager.pruefeBelegung(fachbelegung, nextHalbjahr)) {
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.PF_17_INFO);
                    continue;
                }
                if (this.projektkurs !== null) {
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.PF_14);
                    break;
                }
                this.projektkurs = fachbelegung;
                if (this.projektkursHalbjahre === null)
                    this.projektkursHalbjahre = new Vector_1.Vector();
                this.projektkursHalbjahre.add(halbjahr);
                this.projektkursHalbjahre.add(nextHalbjahr);
                break;
            }
        }
    }
    /**
     * Prüfe die Halbjahresbelegungen der belegten Projektfächer. Hierbei Darf
     * es zu Einzelbelegungen neben dem anrechenbaren Projektkurs kommen. Diese dürfen
     * aber nur vor der Belegung des anrechenbaren Kurses liegen. Außerdem dürfen in
     * einem Halbjahr nicht mehrere Projekfächer belegt sein.
     */
    pruefeBelegungHalbjahre() {
        if (this.projektkursBelegung === null)
            return;
        let pjkHalbjahre = new HashSet_1.HashSet();
        for (let fachbelegung of this.projektkursBelegung) {
            for (let belegungHalbjahr of fachbelegung.belegungen) {
                if (belegungHalbjahr === null)
                    continue;
                let halbjahr = GostHalbjahr_1.GostHalbjahr.fromKuerzel(belegungHalbjahr.halbjahrKuerzel);
                if (halbjahr === null)
                    continue;
                if ((halbjahr === GostHalbjahr_1.GostHalbjahr.EF1) || (halbjahr === GostHalbjahr_1.GostHalbjahr.EF2))
                    continue;
                if (!pjkHalbjahre.add(halbjahr)) {
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.PF_14);
                    continue;
                }
                if ((this.projektkurs !== null) && JavaObject_1.JavaObject.equalsTranspiler(this.projektkurs, (fachbelegung)) && (this.projektkursHalbjahre !== null) && this.projektkursHalbjahre.contains(halbjahr))
                    continue;
                let nextHalbjahr = halbjahr.next();
                if ((nextHalbjahr !== null) && (GostFachManager_1.GostFachManager.istWaehlbar(this.manager.getFach(fachbelegung), nextHalbjahr)) && ((this.projektkurs === null) || (this.projektkursHalbjahre === null) || (halbjahr.compareTo(this.projektkursHalbjahre.get(0)) < 0)))
                    continue;
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.PF_14);
            }
        }
    }
    /**
     * Prüft die Belegung der Leitfächer
     */
    pruefeBelegungLeitfaecher() {
        if (this.projektkursBelegung === null)
            return;
        for (let fachbelegung of this.projektkursBelegung) {
            let fach = this.manager.getFach(fachbelegung);
            if (fach === null)
                continue;
            let leitfach1 = this.manager.getFachbelegungByKuerzel(fach.projektKursLeitfach1Kuerzel);
            let leitfach2 = this.manager.getFachbelegungByKuerzel(fach.projektKursLeitfach2Kuerzel);
            if ((leitfach1 !== null) && this.pruefeBelegungLeitfachbelegung(fachbelegung, leitfach1))
                continue;
            if ((leitfach2 !== null) && this.pruefeBelegungLeitfachbelegung(fachbelegung, leitfach2))
                continue;
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.PF_13);
        }
    }
    /**
     * Prüft, ob das Leitfach in Bezug auf die Belegung des Projektfaches die korrekten Halbjahresbelegungen hat.
     *
     * @param projektkurs   die Fachbelegungen des Projektfaches
     * @param leitfach      die Fachbelegungen des Leitfaches
     *
     * @return true, falls das Leitfach eine geeigneten Belegung aufweist, sonst false
     */
    pruefeBelegungLeitfachbelegung(projektkurs, leitfach) {
        if (this.manager.pruefeBelegung(projektkurs, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12)) {
            if ((leitfach !== null) && this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12))
                return true;
        }
        else if (this.manager.pruefeBelegung(projektkurs, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21)) {
            if ((leitfach !== null) && (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12) || this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21)))
                return true;
        }
        else if (this.manager.pruefeBelegung(projektkurs, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22)) {
            if ((leitfach !== null) && ((this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12)) || (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21)) || (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22))))
                return true;
        }
        else if (this.manager.pruefeBelegung(projektkurs, GostHalbjahr_1.GostHalbjahr.Q11)) {
            if ((leitfach !== null) && this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q11))
                return true;
        }
        else if (this.manager.pruefeBelegung(projektkurs, GostHalbjahr_1.GostHalbjahr.Q12)) {
            if ((leitfach !== null) && (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12) || this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q12)))
                return true;
        }
        else if (this.manager.pruefeBelegung(projektkurs, GostHalbjahr_1.GostHalbjahr.Q21)) {
            if ((leitfach !== null) && ((this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12)) || (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21)) || (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q21))))
                return true;
        }
        else if (this.manager.pruefeBelegung(projektkurs, GostHalbjahr_1.GostHalbjahr.Q22)) {
            if ((leitfach !== null) && ((this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12)) || (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21)) || (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22)) || (this.manager.pruefeBelegung(leitfach, GostHalbjahr_1.GostHalbjahr.Q22))))
                return true;
        }
        return false;
    }
    /**
     * Gibt den belegten Projektkurs zurück, fall ein Kurs gültig belegt wurde.
     *
     * @return die Fachbelegung des Projektkurses oder null
     */
    getProjektkurs() {
        return this.projektkurs;
    }
    /**
     * Gibt zurück, ob die angegebene Fachbelegung des Halbjahres eine Fachbelegung des
     * angewählten Projektkurses ist und anrechenbar ist. Sollte sie Teil des Projektkurses
     * sein, aber auch zu einer besonderen Lernleistung gehören, so ist sie nicht anrechenbar.
     *
     * @param fachbelegungHalbjahr   die Fachbelegung des Halbjahres
     *
     * @return true, wenn die Fachbelegung anrechenbar ist.
     */
    istAnrechenbar(fachbelegungHalbjahr) {
        if (fachbelegungHalbjahr === null)
            return false;
        if (GostKursart_1.GostKursart.fromKuerzel(fachbelegungHalbjahr.kursartKuerzel) !== GostKursart_1.GostKursart.PJK)
            return false;
        let halbjahr = GostHalbjahr_1.GostHalbjahr.fromKuerzel(fachbelegungHalbjahr.halbjahrKuerzel);
        if ((this.projektkurs === null) || (this.projektkursHalbjahre === null) || (this.manager.istProjektKursBesondereLernleistung()))
            return false;
        return (halbjahr === this.projektkursHalbjahre.get(0)) || (halbjahr === this.projektkursHalbjahre.get(1));
    }
    /**
     * Gibt die Anzahl der anrechenbaren Kurse für Block I des Abiturs zurück
     *
     * @return die Anzahl der anrechenbaren Kurse
     */
    getAnrechenbareKurse() {
        if ((this.projektkurs === null) || (this.manager.istProjektKursBesondereLernleistung()))
            return 0;
        return 2;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.abschluss.gost.belegpruefung.Projektkurse', 'de.nrw.schule.svws.core.abschluss.gost.GostBelegpruefung'].includes(name);
    }
}
exports.Projektkurse = Projektkurse;
function cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Projektkurse(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Projektkurse = cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Projektkurse;
//# sourceMappingURL=Projektkurse.js.map