"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_GesellschaftswissenschaftenUndReligion = exports.GesellschaftswissenschaftenUndReligion = void 0;
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 GostFachbereich_1 = require("../../../../core/types/gost/GostFachbereich");
const GostSchriftlichkeit_1 = require("../../../../core/types/gost/GostSchriftlichkeit");
const GostHalbjahr_1 = require("../../../../core/types/gost/GostHalbjahr");
const Vector_1 = require("../../../../java/util/Vector");
const GostBelegungsfehler_1 = require("../../../../core/abschluss/gost/GostBelegungsfehler");
class GesellschaftswissenschaftenUndReligion extends GostBelegpruefung_1.GostBelegpruefung {
    gesellschaftswissenschaften = null;
    geschichte = null;
    sozialwissenschaften = null;
    philosophie = null;
    sonstige_gesellschaftswissenschaften = null;
    religion = null;
    zusatzkursFachbelegungen = null;
    /**
     * Erstellt eine neue Belegprüfung für den Bereich der Gesellschaftswissenschaften und Religion.
     *
     * @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.gesellschaftswissenschaften = this.manager.getFachbelegungen(GostFachbereich_1.GostFachbereich.GESELLSCHAFTSWISSENSCHAFTLICH);
        this.geschichte = this.manager.getFachbelegungen(GostFachbereich_1.GostFachbereich.GESCHICHTE);
        this.sozialwissenschaften = this.manager.getFachbelegungen(GostFachbereich_1.GostFachbereich.SOZIALWISSENSCHAFTEN);
        this.philosophie = this.manager.getFachbelegung(GostFachbereich_1.GostFachbereich.PHILOSOPHIE);
        this.sonstige_gesellschaftswissenschaften = this.manager.getFachbelegungen(GostFachbereich_1.GostFachbereich.GESELLSCHAFTSWISSENSCHAFTLICH_SONSTIGE);
        this.religion = this.manager.getFachbelegungen(GostFachbereich_1.GostFachbereich.RELIGION);
        this.zusatzkursFachbelegungen = new Vector_1.Vector();
    }
    pruefeEF1() {
        this.pruefeGesellschaftswissenschaftenEF1();
        this.pruefeReligionEF1();
    }
    /**
     * EF1-Prüfung Punkte 8-10:
     * Prüfe, ob eine Gesellschaftswissenschaft in EF.1 schriftlich belegt wurde und durchgängig belegbar ist
     *    und ob Geschichte belegt wurde
     *    und ob Sozialwissenschaften belegt wurde
     */
    pruefeGesellschaftswissenschaftenEF1() {
        if (!this.manager.pruefeBelegungDurchgehendBelegbarExistiert(this.gesellschaftswissenschaften, GostSchriftlichkeit_1.GostSchriftlichkeit.BELIEBIG, GostHalbjahr_1.GostHalbjahr.EF1))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GW_10);
        if (!this.manager.pruefeBelegungExistiertMitSchriftlichkeitEinzeln(this.gesellschaftswissenschaften, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GW_11);
        if (this.manager.zaehleBelegungInHalbjahren(this.geschichte, GostHalbjahr_1.GostHalbjahr.EF1) <= 0)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GE_1_INFO);
        if (this.manager.zaehleBelegungInHalbjahren(this.sozialwissenschaften, GostHalbjahr_1.GostHalbjahr.EF1) <= 0)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.SW_1_INFO);
    }
    /**
     * EF1-Prüfung Punkt 11:
     * Prüfe, ob Religion in EF.1 belegt wurde oder ob Philosophie und eine weitere durchgehend belegbare Gesellschaftswissenschaft belegt wurde.
     * Falls Philosophie als Ersatz für Religion gewählt wurde, zählt es nicht als durchgehend belegte Gesellschaftswissenschaft.
     */
    pruefeReligionEF1() {
        if (this.manager.pruefeBelegungExistiert(this.religion, GostHalbjahr_1.GostHalbjahr.EF1))
            return;
        if (!this.manager.pruefeBelegung(this.philosophie, GostHalbjahr_1.GostHalbjahr.EF1)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.RE_10);
        }
        else if ((!this.manager.pruefeBelegungDurchgehendBelegbarExistiert(this.geschichte, GostSchriftlichkeit_1.GostSchriftlichkeit.BELIEBIG, GostHalbjahr_1.GostHalbjahr.EF1)) && (!this.manager.pruefeBelegungDurchgehendBelegbarExistiert(this.sozialwissenschaften, GostSchriftlichkeit_1.GostSchriftlichkeit.BELIEBIG, GostHalbjahr_1.GostHalbjahr.EF1)) && (!this.manager.pruefeBelegungDurchgehendBelegbarExistiert(this.sonstige_gesellschaftswissenschaften, GostSchriftlichkeit_1.GostSchriftlichkeit.BELIEBIG, GostHalbjahr_1.GostHalbjahr.EF1))) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.RE_10);
        }
    }
    pruefeGesamt() {
        this.pruefeSchriftlichkeitEF();
        this.pruefeDurchgaengigeBelegung();
        this.pruefeDurchgaengigeBelegungUndSchriftlich();
        this.pruefeZusatzkurs(this.geschichte);
        this.pruefeBelegungGeschichte();
        this.pruefeZusatzkurs(this.sozialwissenschaften);
        this.pruefeBelegungSozialwissenschaften();
        this.pruefeReligionEF();
        this.pruefeReligionQ1();
        this.pruefeReligionKontinuitaet();
    }
    /**
     * Gesamtprüfung Punkt 39:
     * Prüfe, on in EF.1 und EF.2 jeweils ein Fach der Gesellschaftswissenschaften schriftlich belegt wurde
     */
    pruefeSchriftlichkeitEF() {
        if ((!this.manager.pruefeBelegungExistiertMitSchriftlichkeitEinzeln(this.gesellschaftswissenschaften, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1)) || (!this.manager.pruefeBelegungExistiertMitSchriftlichkeitEinzeln(this.gesellschaftswissenschaften, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF2)))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GW_11);
    }
    /**
     * Gesamtprüfung Punkt 38:
     * Prüfe, ob ein Fach der Gesellschaftswissenschaften von EF.1 bis Q2.2 durchgängig belegt wurde
     * - Zusatzkurse zählen hier nicht als Belegung
     */
    pruefeDurchgaengigeBelegung() {
        if (!this.manager.pruefeBelegungExistiert(this.gesellschaftswissenschaften, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GW_10);
    }
    /**
     * Gesamtprüfung Punkt 40:
     * Prüfe, ob ein Fach der Gesellschaftswissenschaften oder Religionslehre von EF.1 bis Q2.2 belegt
     * und von Q1.1 bis Q2.1 schriftlich belegt wurde, damit es als potentielles Abiturfach zur Verfügung steht.
     * - Zusatzkurse zählen hier nicht als Belegung
     */
    pruefeDurchgaengigeBelegungUndSchriftlich() {
        if (this.manager.pruefeBelegungExistiertDurchgehendSchriftlich(this.gesellschaftswissenschaften))
            return;
        if (this.manager.pruefeBelegungExistiertDurchgehendSchriftlich(this.religion))
            return;
        this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GW_12);
    }
    /**
     * Gesamtprüfung Punkte 27, 29 und 30:
     * Prüft, ob der Zusatzkurs genau zwei mal belegt wurde
     *    und ob ein Zusatzkurs belegt wurde, obwohl im Halbjahr zuvor ein Geschichtskurs belegt wurde.
     *
     * @param fachbelegungen   die Fachbelegung für Geschichte oder Sozialwissehschaften
     */
    pruefeZusatzkurs(fachbelegungen) {
        if ((fachbelegungen === null) || (fachbelegungen.size() === 0))
            return;
        fachbelegungen = this.manager.filterBelegungKursartExistiert(fachbelegungen, GostKursart_1.GostKursart.ZK);
        if (fachbelegungen.size() === 0)
            return;
        if (fachbelegungen.size() > 1)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ZK_13);
        for (let fachbelegung of fachbelegungen) {
            let fach = this.manager.getFach(fachbelegung);
            if ((fach === null) || (GostFachManager_1.GostFachManager.istBilingual(fach)))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ZK_13);
            let halbjahre = this.manager.getHalbjahreKursart(fachbelegung, GostKursart_1.GostKursart.ZK);
            if (halbjahre.size() === 2) {
                if (((this.manager.pruefeBelegungMitKursart(fachbelegung, GostKursart_1.GostKursart.ZK, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12)) || (this.manager.pruefeBelegungMitKursart(fachbelegung, GostKursart_1.GostKursart.ZK, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21)) || (this.manager.pruefeBelegungMitKursart(fachbelegung, GostKursart_1.GostKursart.ZK, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22)))) {
                    if (this.zusatzkursFachbelegungen !== null)
                        this.zusatzkursFachbelegungen.add(fachbelegung);
                }
            }
            else if (halbjahre.size() > 1) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ZK_12);
            }
            if (halbjahre.size() > 0) {
                let prevHalbjahr = halbjahre.get(0).previous();
                if ((prevHalbjahr !== null) && (this.manager.pruefeBelegung(fachbelegung, prevHalbjahr)))
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ZK_10);
            }
        }
    }
    /**
     * Gesamtprüfung Punkt 41:
     * Prüft, ob Geschichte korrekt belegt wurde (mind. von EF.1 bis Q1.2 oder als Zusatzkurs)
     */
    pruefeBelegungGeschichte() {
        if ((this.geschichte === null) || (this.geschichte.size() <= 0)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GE_10);
            return;
        }
        if (this.manager.pruefeBelegungExistiert(this.geschichte, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12))
            return;
        if (this.zusatzkursFachbelegungen !== null)
            for (let zkBelegung of this.zusatzkursFachbelegungen)
                if (this.geschichte.contains(zkBelegung))
                    return;
        this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.GE_10);
    }
    /**
     * Gesamtprüfung Punkt 42:
     * Prüft, ob Sozialwissenschaften korrekt belegt wurde (mind. von EF.1 bis Q1.2 oder als Zusatzkurs)
     */
    pruefeBelegungSozialwissenschaften() {
        if ((this.sozialwissenschaften === null) || (this.sozialwissenschaften.size() <= 0)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.SW_10);
            return;
        }
        if (this.manager.pruefeBelegungExistiert(this.sozialwissenschaften, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12))
            return;
        if (this.zusatzkursFachbelegungen !== null)
            for (let zkBelegung of this.zusatzkursFachbelegungen)
                if (this.sozialwissenschaften.contains(zkBelegung))
                    return;
        this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.SW_10);
    }
    /**
     * Gesamtprüfung Punkte 43:
     * Prüft die Belegung von Religion und Philosophie in der EF. Wird Philosophie als Ersatz belegt, so wird auch geprüft,
     * ob eine weitere Gesellschaftswissenschaft belegt wurde.
     */
    pruefeReligionEF() {
        for (let halbjahr of GostHalbjahr_1.GostHalbjahr.getEinfuehrungsphase()) {
            if (this.manager.pruefeBelegungExistiertEinzeln(this.religion, halbjahr))
                continue;
            if ((!this.manager.pruefeBelegung(this.philosophie, halbjahr)) || (this.manager.pruefeDurchgaengigkeit(this.philosophie) && (this.manager.zaehleBelegungInHalbjahren(this.gesellschaftswissenschaften, halbjahr) <= 1))) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.RE_10);
                break;
            }
        }
    }
    /**
     * Gesamtprüfung Punkt 44:
     * Prüft die Belegung von Religion und Philosophie. Wird Philosophie als Ersatz belegt, so wird auch geprüft, ob eine weitere
     * Gesellschaftswissenschaft belegt wurde.
     */
    pruefeReligionQ1() {
        for (let halbjahr of GostHalbjahr_1.GostHalbjahr.getHalbjahreFromJahrgang("Q1")) {
            if (this.manager.pruefeBelegungExistiertEinzeln(this.religion, halbjahr))
                continue;
            if (!this.manager.pruefeBelegung(this.philosophie, halbjahr)) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.RE_10);
                return;
            }
            if (this.manager.pruefeDurchgaengigkeit(this.philosophie) && (this.manager.zaehleDurchgaengigeBelegungen(this.gesellschaftswissenschaften) > 1))
                continue;
            if (!this.manager.pruefeDurchgaengigkeit(this.philosophie) && (this.manager.zaehleDurchgaengigeBelegungen(this.gesellschaftswissenschaften) > 0))
                continue;
            if (this.manager.zaehleBelegungInHalbjahren(this.sonstige_gesellschaftswissenschaften, halbjahr) > 0)
                continue;
            if ((halbjahr === GostHalbjahr_1.GostHalbjahr.Q11) && (this.manager.pruefeBelegungExistiertEinzeln(this.geschichte, GostHalbjahr_1.GostHalbjahr.Q11) || this.manager.pruefeBelegungExistiertEinzeln(this.sozialwissenschaften, GostHalbjahr_1.GostHalbjahr.Q11)))
                continue;
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.RE_10);
            break;
        }
    }
    /**
     * Gesamtprüfung Punkt 55:
     * Prüft, ob Fehler bei der Kontinuität bei Philosophie und Religion nur durch die Ersatzfachregelung bei Religion
     * zustandekommen und damit zulässig sind.
     */
    pruefeReligionKontinuitaet() {
        if (this.philosophie === null)
            return;
        for (let belegung of this.philosophie.belegungen) {
            if (belegung === null)
                continue;
            let halbjahr = GostHalbjahr_1.GostHalbjahr.fromKuerzel(belegung.halbjahrKuerzel);
            if (halbjahr === null)
                continue;
            let prevHalbjahr = halbjahr.previous();
            if (prevHalbjahr === null)
                continue;
            if (this.manager.pruefeBelegung(this.philosophie, prevHalbjahr))
                continue;
            if (this.manager.pruefeBelegungExistiertEinzeln(this.religion, halbjahr))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.E1BEL_10);
            if (!this.manager.pruefeBelegungExistiertEinzeln(this.religion, prevHalbjahr))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.E1BEL_10);
        }
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.abschluss.gost.belegpruefung.GesellschaftswissenschaftenUndReligion', 'de.nrw.schule.svws.core.abschluss.gost.GostBelegpruefung'].includes(name);
    }
}
exports.GesellschaftswissenschaftenUndReligion = GesellschaftswissenschaftenUndReligion;
function cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_GesellschaftswissenschaftenUndReligion(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_GesellschaftswissenschaftenUndReligion = cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_GesellschaftswissenschaftenUndReligion;
//# sourceMappingURL=GesellschaftswissenschaftenUndReligion.js.map