"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_AbiFaecher = exports.AbiFaecher = void 0;
const GostAbiturFach_1 = require("../../../../core/types/gost/GostAbiturFach");
const HashMap_1 = require("../../../../java/util/HashMap");
const GostBelegpruefung_1 = require("../../../../core/abschluss/gost/GostBelegpruefung");
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 GostBelegungsfehler_1 = require("../../../../core/abschluss/gost/GostBelegungsfehler");
const HashSet_1 = require("../../../../java/util/HashSet");
class AbiFaecher extends GostBelegpruefung_1.GostBelegpruefung {
    mapAbiturFachbelegungen = null;
    anzahlAbiFaecher = 0;
    anzahlDeutschMatheFremdsprache = 0;
    anzahlFremdsprachen = 0;
    anzahlSportReligion = 0;
    hatAufgabenfeldI = false;
    hatAufgabenfeldII = false;
    hatAufgabenfeldIII = false;
    /**
     * 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.mapAbiturFachbelegungen = new HashMap_1.HashMap();
        this.anzahlAbiFaecher = 0;
        this.anzahlDeutschMatheFremdsprache = 0;
        this.anzahlFremdsprachen = 0;
        this.anzahlSportReligion = 0;
        this.hatAufgabenfeldI = false;
        this.hatAufgabenfeldII = false;
        this.hatAufgabenfeldIII = false;
        let alleFachbelegungen = this.manager.getFachbelegungen();
        for (let i = 0; i < alleFachbelegungen.size(); i++) {
            let fachbelegung = alleFachbelegungen.get(i);
            let abiturFach = GostAbiturFach_1.GostAbiturFach.fromID(fachbelegung.abiturFach);
            if (abiturFach === null)
                continue;
            this.mapAbiturFachbelegungen.put(abiturFach, fachbelegung);
            this.anzahlAbiFaecher++;
            let fach = this.manager.getFach(fachbelegung);
            if (fach === null)
                continue;
            if (GostFachbereich_1.GostFachbereich.FREMDSPRACHE.hat(fach) || GostFachbereich_1.GostFachbereich.DEUTSCH.hat(fach))
                this.hatAufgabenfeldI = true;
            if (GostFachbereich_1.GostFachbereich.GESELLSCHAFTSWISSENSCHAFTLICH_MIT_RELIGION.hat(fach))
                this.hatAufgabenfeldII = true;
            if (GostFachbereich_1.GostFachbereich.MATHEMATISCH_NATURWISSENSCHAFTLICH.hat(fach))
                this.hatAufgabenfeldIII = true;
            if (GostFachbereich_1.GostFachbereich.FREMDSPRACHE.hat(fach) || GostFachbereich_1.GostFachbereich.DEUTSCH.hat(fach) || GostFachbereich_1.GostFachbereich.MATHEMATIK.hat(fach))
                this.anzahlDeutschMatheFremdsprache++;
            if (GostFachbereich_1.GostFachbereich.FREMDSPRACHE.hat(fach))
                this.anzahlFremdsprachen++;
            if (GostFachbereich_1.GostFachbereich.SPORT.hat(fach) || GostFachbereich_1.GostFachbereich.RELIGION.hat(fach))
                this.anzahlSportReligion++;
        }
    }
    pruefeEF1() {
    }
    pruefeGesamt() {
        this.pruefeLK1();
        this.pruefeAnzahlUndAufgabenfelderAbiFaecher();
        this.pruefeMehrfacheAbiturfaecher();
        this.pruefeSchriftlichkeitAB3undAB4();
    }
    /**
     * Gesamtprüfung Punkt 70:
     * Prüfe, ob der erste LK eine fortgeführte Fremdsprache, eine klassische Naturwissenschaft, Mathematik oder Deutsch ist
     */
    pruefeLK1() {
        let lk1 = this.mapAbiturFachbelegungen === null ? null : this.mapAbiturFachbelegungen.get(GostAbiturFach_1.GostAbiturFach.LK1);
        let lk1fach = this.manager.getFach(lk1);
        if ((lk1 === null) || (lk1fach === null) || !((GostFachbereich_1.GostFachbereich.DEUTSCH.hat(lk1fach)) || (GostFachbereich_1.GostFachbereich.FREMDSPRACHE.hat(lk1fach) && !lk1.istFSNeu) || (GostFachbereich_1.GostFachbereich.MATHEMATIK.hat(lk1fach)) || (GostFachbereich_1.GostFachbereich.NATURWISSENSCHAFTLICH_KLASSISCH.hat(lk1fach))))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.LK1_11);
    }
    /**
     * Gesamtprüfung Punkt 71-74:
     * Prüfe, ob die Zahl der Abiturfächer 4 ist und diese alle Aufgabenfelder abdecken
     *    und ob mindestens 2 Fächer im Bereich Deutsch, Fremdsprache, Mathematik liegen
     *    und ob maximale 1 Fach im Bereich Sport und Religion liegt
     *    und ob Sport nicht als erstes oder drittes Abiturfach gewählt wurde
     */
    pruefeAnzahlUndAufgabenfelderAbiFaecher() {
        if ((this.anzahlAbiFaecher !== 4) || (!this.hatAufgabenfeldI) || (!this.hatAufgabenfeldII) || (!this.hatAufgabenfeldIII))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.LK1_13);
        if (this.anzahlDeutschMatheFremdsprache < 2)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_10);
        if ((this.anzahlDeutschMatheFremdsprache < 3) && (this.anzahlFremdsprachen > 1))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_19);
        if (this.anzahlSportReligion > 1)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_11);
        let lk1 = this.mapAbiturFachbelegungen === null ? null : this.mapAbiturFachbelegungen.get(GostAbiturFach_1.GostAbiturFach.LK1);
        let lk1fach = this.manager.getFach(lk1);
        let ab3 = this.mapAbiturFachbelegungen === null ? null : this.mapAbiturFachbelegungen.get(GostAbiturFach_1.GostAbiturFach.AB3);
        let ab3fach = this.manager.getFach(ab3);
        if (((lk1fach !== null) && (GostFachbereich_1.GostFachbereich.SPORT.hat(lk1fach.kuerzel))) || ((ab3fach !== null) && (GostFachbereich_1.GostFachbereich.SPORT.hat(ab3fach.kuerzel))))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_15);
    }
    /**
     * Gesamtprüfung: Prüfe, ob eines der Abiturfächer mehrfach belegt wurde. Es ist nicht zulässig
     * Abiturfächer mehrfach belegt zu haben.
     */
    pruefeMehrfacheAbiturfaecher() {
        let abiFaecher = new HashSet_1.HashSet();
        let alleFachbelegungen = this.manager.getFachbelegungen();
        for (let i = 0; i < alleFachbelegungen.size(); i++) {
            let fachbelegung = alleFachbelegungen.get(i);
            let abiturFach = GostAbiturFach_1.GostAbiturFach.fromID(fachbelegung.abiturFach);
            if (abiturFach === null)
                continue;
            if (!abiFaecher.contains(abiturFach)) {
                abiFaecher.add(abiturFach);
                continue;
            }
            switch (abiturFach) {
                case GostAbiturFach_1.GostAbiturFach.LK1:
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_21);
                    break;
                case GostAbiturFach_1.GostAbiturFach.LK2:
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_22);
                    break;
                case GostAbiturFach_1.GostAbiturFach.AB3:
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_23);
                    break;
                case GostAbiturFach_1.GostAbiturFach.AB4:
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_24);
                    break;
            }
        }
    }
    /**
     * Gesamtprüfung Punkte 76 und 77:
     * Prüfe ob das 3. Abiturfach von Q1.1 bis Q2.2 schriftlich belegt wurde
     *   und on das 4. Abiturfach von Q1.1 bis Q2.1 schritlich und in Q2.2 mündlich belegt wurde
     *
     */
    pruefeSchriftlichkeitAB3undAB4() {
        let ab3 = this.mapAbiturFachbelegungen === null ? null : this.mapAbiturFachbelegungen.get(GostAbiturFach_1.GostAbiturFach.AB3);
        if (ab3 !== null) {
            if (!this.manager.pruefeBelegungMitSchriftlichkeit(ab3, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_17);
            if (!this.manager.pruefeBelegungMitSchriftlichkeitEinzeln(ab3, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.Q22))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_12);
        }
        let ab4 = this.mapAbiturFachbelegungen === null ? null : this.mapAbiturFachbelegungen.get(GostAbiturFach_1.GostAbiturFach.AB4);
        if (ab4 !== null) {
            if (!this.manager.pruefeBelegungMitSchriftlichkeit(ab4, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_18);
            if (!this.manager.pruefeBelegungMitSchriftlichkeitEinzeln(ab4, GostSchriftlichkeit_1.GostSchriftlichkeit.MUENDLICH, GostHalbjahr_1.GostHalbjahr.Q22))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.ABI_13);
        }
    }
    /**
     * Liefert die zugehörige Abitur-Fachbelegung zurück.
     *
     * @param abifach  die Art des Abifachs (1., 2., 3. oder 4. Fach)
     *
     * @return die Abitur-Fachbelegung oder null, falls es (noch) nicht festgelegt wurde
     */
    getAbiturfach(abifach) {
        return this.mapAbiturFachbelegungen === null ? null : this.mapAbiturFachbelegungen.get(abifach);
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.abschluss.gost.belegpruefung.AbiFaecher', 'de.nrw.schule.svws.core.abschluss.gost.GostBelegpruefung'].includes(name);
    }
}
exports.AbiFaecher = AbiFaecher;
function cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_AbiFaecher(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_AbiFaecher = cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_AbiFaecher;
//# sourceMappingURL=AbiFaecher.js.map