"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Fremdsprachen = exports.Fremdsprachen = void 0;
const JavaObject_1 = require("../../../../java/lang/JavaObject");
const SprachendatenManager_1 = require("../../../../core/SprachendatenManager");
const GostAbiturFach_1 = require("../../../../core/types/gost/GostAbiturFach");
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 GostHalbjahr_1 = require("../../../../core/types/gost/GostHalbjahr");
const GostSchriftlichkeit_1 = require("../../../../core/types/gost/GostSchriftlichkeit");
const Vector_1 = require("../../../../java/util/Vector");
const GostBelegungsfehler_1 = require("../../../../core/abschluss/gost/GostBelegungsfehler");
class Fremdsprachen extends GostBelegpruefung_1.GostBelegpruefung {
    fremdsprachen = new Vector_1.Vector();
    fremdsprachen_neu = new Vector_1.Vector();
    fremdsprachen_fortgefuehrt = new Vector_1.Vector();
    biliSachfaecher = new Vector_1.Vector();
    anzahl_schriftlich_durchgehend = 0;
    /**
     * Erstellt eine neue Belegprüfung für dir Fremdsprachen.
     *
     * @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.fremdsprachen = this.manager.getFachbelegungen(GostFachbereich_1.GostFachbereich.FREMDSPRACHE);
        this.fremdsprachen_neu = this.manager.filterFremdspracheNeuEinsetzend(this.fremdsprachen);
        this.fremdsprachen_fortgefuehrt = this.manager.filterFremdspracheFortgefuehrt(this.fremdsprachen);
        this.biliSachfaecher = this.manager.getFachbelegungenBilingual();
        this.anzahl_schriftlich_durchgehend = 0;
    }
    pruefeEF1() {
        this.pruefeEF1Sprachenfolge();
        this.pruefeEF1Fremdsprache1();
        this.pruefeEF1FremdsprachenfolgeZweiteFremdsprache();
        this.pruefeEF1Schriftlichkeit();
        this.pruefeEF1AnzahlDurchgehenedeSprachen();
        this.pruefeEF1BilingualeSachfaecher();
        this.pruefeEF1BilingualenBildungsgang();
    }
    /**
     * EF.1: Prüft bei der Sprachenfolge, ob eine gemäß Sprachenfolge fortgeführte
     * Fremdsprache fehlerhafterweise als neu einsetzende Fremdsprache belegt wurde.
     */
    pruefeEF1Sprachenfolge() {
        if (this.manager.hatFortgefuehrteFremdspracheInSprachendaten(this.fremdsprachen_neu))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_20);
        if (this.manager.hatNeuEinsetzendeFremdspracheInSprachendaten(this.fremdsprachen_fortgefuehrt))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_21);
        if (!SprachendatenManager_1.SprachendatenManager.hatSprachbelegung(this.manager.getSprachendaten(), "E"))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_22_INFO);
    }
    /**
     * Prüft, ob eine gültige Fremdsprachenbelegung mit den EF.1-Wahlen möglich ist.
     */
    pruefeEF1Fremdsprache1() {
        let gefundenFremdsprachenbelegung = false;
        let gefundenFortgefuehrteFremdsprachenbelegungOhneSprachenfolge = false;
        let gefundenFortgefuehrteFremdspracheAlsNeueinsetzende = false;
        let anzahlFortgefuehrteFremdsprachen = 0;
        let anzahlFortgefuehrteFremdsprachenEFBelegbar = 0;
        let anzahlFortgefuehrteFremdsprachenEFBelegbarFehlerMuendlich = 0;
        let anzahlFortgefuehrteFremdsprachenDurchgehendBelegbar = 0;
        let anzahlFortgefuehrteFremdsprachenDurchgehendBelegbarFehlerMuendlich = 0;
        let anzahlFortfuehrbareFremdsprachen = 0;
        anzahlFortfuehrbareFremdsprachen = SprachendatenManager_1.SprachendatenManager.getFortfuehrbareSprachenInGOSt(this.manager.getSprachendaten()).size();
        for (let abiFachbelegung of this.fremdsprachen_fortgefuehrt) {
            if (!this.manager.pruefeBelegung(abiFachbelegung, GostHalbjahr_1.GostHalbjahr.EF1)) {
                continue;
            }
            gefundenFremdsprachenbelegung = true;
            let gostFach = this.manager.getFach(abiFachbelegung);
            if (gostFach !== null && !JavaObject_1.JavaObject.equalsTranspiler(gostFach.kuerzel, (""))) {
                if (SprachendatenManager_1.SprachendatenManager.istFortfuehrbareSpracheInGOSt(this.manager.getSprachendaten(), gostFach.kuerzel.substring(0, 1))) {
                    anzahlFortgefuehrteFremdsprachen += 1;
                    if (this.manager.pruefeBelegungDurchgehendBelegbar(abiFachbelegung, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1)) {
                        anzahlFortgefuehrteFremdsprachenDurchgehendBelegbar += 1;
                    }
                    else if (this.manager.pruefeBelegungDurchgehendBelegbar(abiFachbelegung, GostSchriftlichkeit_1.GostSchriftlichkeit.MUENDLICH, GostHalbjahr_1.GostHalbjahr.EF1)) {
                        anzahlFortgefuehrteFremdsprachenDurchgehendBelegbar += 1;
                        anzahlFortgefuehrteFremdsprachenDurchgehendBelegbarFehlerMuendlich += 1;
                    }
                    else if ((gostFach.istMoeglichEF1) && (gostFach.istMoeglichEF2)) {
                        anzahlFortgefuehrteFremdsprachenEFBelegbar += 1;
                        if (this.manager.pruefeBelegungMitSchriftlichkeit(abiFachbelegung, GostSchriftlichkeit_1.GostSchriftlichkeit.MUENDLICH, GostHalbjahr_1.GostHalbjahr.EF1)) {
                            anzahlFortgefuehrteFremdsprachenEFBelegbarFehlerMuendlich += 1;
                        }
                    }
                }
                else {
                    gefundenFortgefuehrteFremdsprachenbelegungOhneSprachenfolge = true;
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_23);
                }
            }
        }
        if ((anzahlFortgefuehrteFremdsprachenDurchgehendBelegbarFehlerMuendlich + anzahlFortgefuehrteFremdsprachenEFBelegbarFehlerMuendlich) > 0) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_12);
        }
        if ((anzahlFortgefuehrteFremdsprachen > 0) && (anzahlFortgefuehrteFremdsprachen === (anzahlFortgefuehrteFremdsprachenDurchgehendBelegbarFehlerMuendlich + anzahlFortgefuehrteFremdsprachenEFBelegbarFehlerMuendlich))) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_18);
        }
        if (anzahlFortgefuehrteFremdsprachenDurchgehendBelegbar > 0) {
            return;
        }
        let anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbar = 0;
        let anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbarFehlerMuendlich = 0;
        for (let abiFachbelegung of this.fremdsprachen_neu) {
            if (!this.manager.pruefeBelegung(abiFachbelegung, GostHalbjahr_1.GostHalbjahr.EF1)) {
                continue;
            }
            gefundenFremdsprachenbelegung = true;
            let gostFach = this.manager.getFach(abiFachbelegung);
            if (gostFach !== null && !JavaObject_1.JavaObject.equalsTranspiler(gostFach.kuerzel, (""))) {
                if (!SprachendatenManager_1.SprachendatenManager.istFortfuehrbareSpracheInGOSt(this.manager.getSprachendaten(), gostFach.kuerzel.substring(0, 1))) {
                    if (this.manager.pruefeBelegungDurchgehendBelegbar(abiFachbelegung, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1)) {
                        anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbar += 1;
                    }
                    else if (this.manager.pruefeBelegungDurchgehendBelegbar(abiFachbelegung, GostSchriftlichkeit_1.GostSchriftlichkeit.MUENDLICH, GostHalbjahr_1.GostHalbjahr.EF1)) {
                        anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbar += 1;
                        anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbarFehlerMuendlich += 1;
                    }
                }
                else {
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_20);
                    gefundenFortgefuehrteFremdspracheAlsNeueinsetzende = true;
                }
            }
        }
        if (anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbarFehlerMuendlich > 0) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_12);
        }
        if ((gefundenFremdsprachenbelegung && !(gefundenFortgefuehrteFremdsprachenbelegungOhneSprachenfolge || gefundenFortgefuehrteFremdspracheAlsNeueinsetzende)) && (anzahlFortgefuehrteFremdsprachenDurchgehendBelegbar + anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbar === 0)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_11);
        }
        if (anzahlFortgefuehrteFremdsprachenEFBelegbar > 0) {
            if (anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbar === 0) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_10);
            }
            return;
        }
        if (anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbar === 0) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_18);
            return;
        }
        if ((anzahlFortgefuehrteFremdsprachenDurchgehendBelegbar + anzahlFortgefuehrteFremdsprachenEFBelegbar) === 0 && anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbar > 0) {
            if (anzahlNeueinsetzendeFremdsprachenDurchgehendBelegbarFehlerMuendlich > 0) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_18);
            }
            if (this.manager.hatMuttersprachenPruefungEndeEF()) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_19_INFO);
            }
            else {
                if (anzahlFortfuehrbareFremdsprachen === 0) {
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_25);
                }
                else {
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_18);
                    if (!SprachendatenManager_1.SprachendatenManager.hatZweiSprachenMitMin4JahrenDauerEndeSekI(this.manager.getSprachendaten()))
                        this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_24);
                }
            }
        }
    }
    /**
     * Prüft, ob eine zweite Fremdsprache in der Sek I vorhanden ist und prüft sonst auf eine neu
     * einsetzende Fremdsprache.
     */
    pruefeEF1FremdsprachenfolgeZweiteFremdsprache() {
        if (SprachendatenManager_1.SprachendatenManager.hatZweiSprachenMitMin4JahrenDauerEndeSekI(this.manager.getSprachendaten()))
            return;
        if (SprachendatenManager_1.SprachendatenManager.hatEineSpracheMitMin4JahrenDauerEndeSekI(this.manager.getSprachendaten())) {
            if (this.manager.pruefeBelegungExistiertMitSchriftlichkeitEinzeln(this.fremdsprachen_neu, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1))
                return;
            if (SprachendatenManager_1.SprachendatenManager.hatSpracheMit2JahrenDauerEndeSekI(this.manager.getSprachendaten())) {
                let zweiteFremdsprache = this.manager.getSprachbelegung(SprachendatenManager_1.SprachendatenManager.getSpracheMit2JahrenDauerEndeSekI(this.manager.getSprachendaten()));
                if (!this.manager.pruefeBelegungMitSchriftlichkeitEinzeln(zweiteFremdsprache, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1))
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_13);
                return;
            }
        }
        if (!this.manager.pruefeBelegungExistiertMitSchriftlichkeitEinzeln(this.fremdsprachen_neu, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_14);
        }
    }
    /**
     * Prüft, ob alle Fremdsprachen in der EF.1 schriftlich belegt wurden.
     */
    pruefeEF1Schriftlichkeit() {
        if (this.fremdsprachen === null)
            return;
        for (let fachbelegung of this.fremdsprachen)
            if (this.manager.pruefeBelegungMitSchriftlichkeitEinzeln(fachbelegung, GostSchriftlichkeit_1.GostSchriftlichkeit.BELIEBIG, GostHalbjahr_1.GostHalbjahr.EF1) && !this.manager.pruefeBelegungMitSchriftlichkeitEinzeln(fachbelegung, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1)) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_12);
                break;
            }
    }
    /**
     * Zähle alle Fremdsprachen, die durchgehend schriftlich belegt wurden.
     * Hierzu zählt auch die Unterrichtssprache eines bilingualen Sachfachs als zweite durchgehende
     * Fremdsprache, sofern dieses durchgehende und schriftlich belegt werden kann.
     */
    pruefeEF1AnzahlDurchgehenedeSprachen() {
        let fremdsprachenDurchgehend = this.manager.filterBelegungenMitSchriftlichkeit(this.manager.filterDurchgehendBelegbar(this.fremdsprachen), GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1);
        this.anzahl_schriftlich_durchgehend = fremdsprachenDurchgehend.size();
        if (this.anzahl_schriftlich_durchgehend !== 1)
            return;
        let fsDurchgehend = this.manager.getFach(fremdsprachenDurchgehend.get(0));
        if (fsDurchgehend === null)
            return;
        let fremdspracheDurchgehend = GostFachManager_1.GostFachManager.getFremdsprache(fsDurchgehend);
        if (fremdspracheDurchgehend === null)
            return;
        let biliSachfaecherDurchgehendSchriftlich = this.manager.filterBelegungenMitSchriftlichkeit(this.manager.filterDurchgehendBelegbar(this.biliSachfaecher), GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1);
        for (let biliSachfach of biliSachfaecherDurchgehendSchriftlich) {
            let fach = this.manager.getFach(biliSachfach);
            if ((fach === null) || (JavaObject_1.JavaObject.equalsTranspiler(fremdspracheDurchgehend, (fach.biliSprache))))
                continue;
            this.anzahl_schriftlich_durchgehend++;
            return;
        }
    }
    /**
     * Prüft, ob die Bedingungen für die Wahl eines bilingualen Sachfaches erfüllt sind, sofern eines
     * in der EF.1 belegt wurde.
     */
    pruefeEF1BilingualeSachfaecher() {
        if (this.biliSachfaecher === null)
            return;
        for (let biliSachfach of this.biliSachfaecher) {
            let fach = this.manager.getFach(biliSachfach);
            if (fach === null)
                continue;
            let biliSprache = fach.biliSprache;
            if (!SprachendatenManager_1.SprachendatenManager.hatSprachbelegungInSekIMitDauer(this.manager.getSprachendaten(), biliSprache, 2)) {
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_14);
                continue;
            }
            let fremdsprache = this.manager.getSprachbelegung(biliSprache);
            if (this.manager.pruefeBelegungMitSchriftlichkeitEinzeln(fremdsprache, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1) || this.manager.pruefeBelegungMitSchriftlichkeitEinzeln(biliSachfach, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1))
                continue;
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_4_INFO);
        }
    }
    /**
     * Prüfe, ob die Bedingungen für den bilingualen Bildungsgang erfüllt sind, sofern ein solcher vom Schüler gewählt wurde.
     */
    pruefeEF1BilingualenBildungsgang() {
        let biligualeSprache = this.manager.getBiligualenBildungsgang();
        if (biligualeSprache === null)
            return;
        let biliSprache = this.manager.getSprachbelegung(biligualeSprache);
        if (!this.manager.pruefeBelegungDurchgehendBelegbar(biliSprache, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_10);
        if ((this.biliSachfaecher === null) || (this.biliSachfaecher.size() < 1)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_15);
            return;
        }
        if (this.biliSachfaecher.size() < 2)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_11_INFO);
    }
    pruefeGesamt() {
        this.pruefeGesamtSprachenfolge();
        this.pruefeGesamtFremdsprache1();
        this.pruefeGesamtFremdsprachenfolgeZweiteFremdsprache();
        this.pruefeGesamtSchriftlichkeit();
        this.pruefeGesamtAnzahlDurchgehenedeSprachen();
        this.pruefeGesamtBilingualeSachfaecher();
        this.pruefeGesamtBilingualenBildungsgang();
    }
    /**
     * Gesamt: Prüft bei der Sprachenfolge, ob eine laut Sprachenfolge fortgeführte
     * Fremdpsrache fehlerhafterweise als neu einsetzende Fremdsprache belegt wurde.
     */
    pruefeGesamtSprachenfolge() {
        if (this.manager.hatFortgefuehrteFremdspracheInSprachendaten(this.fremdsprachen_neu))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_20);
        if (this.manager.hatNeuEinsetzendeFremdspracheInSprachendaten(this.fremdsprachen_fortgefuehrt))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_21);
        if (!SprachendatenManager_1.SprachendatenManager.hatSprachbelegung(this.manager.getSprachendaten(), "E"))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_22_INFO);
    }
    /**
     * Prüft, ob eine gültige Fremdsprachenbelegung in Bezug auf eine durchgehende Belegung möglich ist.
     */
    pruefeGesamtFremdsprache1() {
        if (this.manager.pruefeBelegungExistiert(this.fremdsprachen_fortgefuehrt, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22))
            return;
        if (this.manager.hatMuttersprachenPruefungEndeEF()) {
            if (this.manager.pruefeBelegungExistiert(this.fremdsprachen_neu, 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.FS_19_INFO);
            else
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_18);
            return;
        }
        if (!this.manager.pruefeBelegungExistiert(this.fremdsprachen_fortgefuehrt, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_10);
            return;
        }
        if (!this.manager.pruefeBelegungExistiert(this.fremdsprachen_neu, 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.FS_10);
    }
    /**
     * Prüft, ob eine zweite Fremdsprache in der Sek I vorhanden ist und prüft sonst auf eine neu
     * einsetzende Fremdsprache.
     */
    pruefeGesamtFremdsprachenfolgeZweiteFremdsprache() {
        if (this.manager.istSekIZweiteFremdspracheManuellGeprueft())
            return;
        if (SprachendatenManager_1.SprachendatenManager.hatZweiSprachenMitMin4JahrenDauerEndeSekI(this.manager.getSprachendaten()))
            return;
        if (SprachendatenManager_1.SprachendatenManager.hatEineSpracheMitMin4JahrenDauerEndeSekI(this.manager.getSprachendaten())) {
            if (this.manager.pruefeBelegungExistiert(this.fremdsprachen_neu, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22))
                return;
            if (SprachendatenManager_1.SprachendatenManager.hatSprachfeststellungspruefungAufEFNiveau(this.manager.getSprachendaten()) || this.manager.hatMuttersprachenPruefungEndeEF()) {
                return;
            }
            if (SprachendatenManager_1.SprachendatenManager.hatSpracheMit2JahrenDauerEndeSekI(this.manager.getSprachendaten())) {
                let zweiteFremdsprache = this.manager.getSprachbelegung(SprachendatenManager_1.SprachendatenManager.getSpracheMit2JahrenDauerEndeSekI(this.manager.getSprachendaten()));
                if (!this.manager.pruefeBelegungMitSchriftlichkeit(zweiteFremdsprache, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2))
                    this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_13);
                return;
            }
        }
        if (SprachendatenManager_1.SprachendatenManager.hatSpracheMit2JahrenDauerEndeSekI(this.manager.getSprachendaten())) {
            let zweiteFremdsprache = this.manager.getSprachbelegung(SprachendatenManager_1.SprachendatenManager.getSpracheMit2JahrenDauerEndeSekI(this.manager.getSprachendaten()));
            if (!this.manager.pruefeBelegungMitSchriftlichkeit(zweiteFremdsprache, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_13);
            if (this.manager.pruefeBelegungExistiert(this.fremdsprachen_neu, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22))
                return;
            if (SprachendatenManager_1.SprachendatenManager.hatSprachfeststellungspruefungAufEFNiveau(this.manager.getSprachendaten()) || this.manager.hatMuttersprachenPruefungEndeEF()) {
                return;
            }
        }
        if (this.manager.pruefeBelegungExistiert(this.fremdsprachen_neu, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22)) {
            if (SprachendatenManager_1.SprachendatenManager.hatSprachfeststellungspruefungAufEFNiveau(this.manager.getSprachendaten()) || this.manager.hatMuttersprachenPruefungEndeEF()) {
                return;
            }
            return;
        }
        this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_14);
    }
    /**
     * Prüft, ob eine gültige Fremdsprachenbelegung in Bezug auf die Schriftlichkeit und LK-Wahl vohanden ist.
     */
    pruefeGesamtSchriftlichkeit() {
        if (this.manager.pruefeBelegungExistiertHatMindestensEinmalSchriftlichkeit(this.fremdsprachen_neu, GostSchriftlichkeit_1.GostSchriftlichkeit.MUENDLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_15);
        if (this.manager.pruefeBelegungExistiertHatMindestensEinmalKursart(this.fremdsprachen_neu, GostKursart_1.GostKursart.LK, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_17);
        if (this.manager.pruefeBelegungExistiertErfuelltNichtFallsBelegt(this.fremdsprachen_fortgefuehrt, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_12);
        if (this.manager.pruefeBelegungDurchgehendBelegtExistiert(this.fremdsprachen_fortgefuehrt, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21))
            return;
        if (!this.manager.pruefeBelegungDurchgehendBelegtExistiert(this.fremdsprachen_neu, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21)) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_11);
            return;
        }
        if (this.manager.hatMuttersprachenPruefungEndeEF() && this.manager.pruefeBelegungExistiertMitSchriftlichkeit(this.fremdsprachen_fortgefuehrt, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2))
            return;
        if (this.manager.hatMuttersprachenPruefungEndeEF() && this.manager.pruefeBelegungDurchgehendBelegtExistiert(this.fremdsprachen_neu, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21))
            return;
        if (!this.manager.pruefeBelegungExistiertMitSchriftlichkeit(this.fremdsprachen_fortgefuehrt, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.FS_16);
    }
    /**
     * Zähle alle Fremdsprachen, die durchgehend schriftlich belegt wurden.
     * Hierzu zählt auch die Unterrichtssprache eines bilingualen Sachfachs als zweite durchgehende
     * Fremdsprache, sofern dieses durchgehend und schriftlich belegt wurde.
     */
    pruefeGesamtAnzahlDurchgehenedeSprachen() {
        let fremdsprachenDurchgehend = this.manager.filterBelegungen(this.fremdsprachen, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22);
        let fremdsprachenDurchgehendSchriftlich = this.manager.filterBelegungenMitSchriftlichkeit(fremdsprachenDurchgehend, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21);
        this.anzahl_schriftlich_durchgehend = fremdsprachenDurchgehendSchriftlich.size();
        if (this.anzahl_schriftlich_durchgehend !== 1)
            return;
        let fsDurchgehend = this.manager.getFach(fremdsprachenDurchgehendSchriftlich.get(0));
        if (fsDurchgehend === null)
            return;
        let fremdspracheDurchgehend = GostFachManager_1.GostFachManager.getFremdsprache(fsDurchgehend);
        if (fremdspracheDurchgehend === null)
            return;
        let biliSachfaecherDurchgehend = this.manager.filterBelegungen(this.biliSachfaecher, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22);
        let biliSachfaecherDurchgehendSchriftlich = this.manager.filterBelegungenMitSchriftlichkeit(biliSachfaecherDurchgehend, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21);
        for (let biliSachfach of biliSachfaecherDurchgehendSchriftlich) {
            let fach = this.manager.getFach(biliSachfach);
            if ((fach === null) || (JavaObject_1.JavaObject.equalsTranspiler(fremdspracheDurchgehend, (fach.biliSprache))))
                continue;
            this.anzahl_schriftlich_durchgehend++;
            return;
        }
    }
    /**
     * Prüft, ob die Bedingungen für die Wahl eines bilingualen Sachfaches erfüllt sind, sofern eines
     * belegt wurde.
     */
    pruefeGesamtBilingualeSachfaecher() {
        if (this.biliSachfaecher === null)
            return;
        for (let biliSachfach of this.biliSachfaecher) {
            let biliFach = this.manager.getFach(biliSachfach);
            if ((biliFach === null) || (!SprachendatenManager_1.SprachendatenManager.hatSprachbelegungInSekIMitDauer(this.manager.getSprachendaten(), biliFach.biliSprache, 2)))
                this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_14);
        }
    }
    /**
     * Prüfe, ob die Bedingungen für ein bilinguales Abitur erfüllt sind, sofern ein solches vom
     * Schüler gewählt wurde.
     */
    pruefeGesamtBilingualenBildungsgang() {
        let biligualeSprache = this.manager.getBiligualenBildungsgang();
        if (biligualeSprache === null)
            return;
        let biliSprache = this.manager.getSprachbelegung(biligualeSprache);
        if ((!this.manager.pruefeBelegungMitSchriftlichkeit(biliSprache, GostSchriftlichkeit_1.GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2) || (!this.manager.pruefeBelegungMitKursart(biliSprache, GostKursart_1.GostKursart.LK, GostHalbjahr_1.GostHalbjahr.Q11, GostHalbjahr_1.GostHalbjahr.Q12, GostHalbjahr_1.GostHalbjahr.Q21, GostHalbjahr_1.GostHalbjahr.Q22))))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_10);
        let biliSachfaecherEF = this.manager.filterBelegungen(this.biliSachfaecher, GostHalbjahr_1.GostHalbjahr.EF1, GostHalbjahr_1.GostHalbjahr.EF2);
        if (biliSachfaecherEF.size() < 1) {
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_15);
            return;
        }
        if (biliSachfaecherEF.size() < 2)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_11_INFO);
        let hatBiliSachfaecherDurchgehendSchriftlich = false;
        if (this.biliSachfaecher !== null) {
            for (let fach of this.biliSachfaecher) {
                if (this.manager.pruefeDurchgaengigkeitSchriftlich(fach)) {
                    hatBiliSachfaecherDurchgehendSchriftlich = true;
                    break;
                }
            }
        }
        if (!hatBiliSachfaecherDurchgehendSchriftlich)
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_12);
        if (!this.manager.pruefeExistiertAbiFach(this.biliSachfaecher, GostAbiturFach_1.GostAbiturFach.AB3, GostAbiturFach_1.GostAbiturFach.AB4))
            this.addFehler(GostBelegungsfehler_1.GostBelegungsfehler.BIL_13);
    }
    /**
     * Gibt die Anzahl der durchgehend schriftlich belegten bzw. belegbaren Fremdsprachen zurück.
     * Durchgehend schriftlich bedeutet, dass das Fach mind. von EF.1 bis Q2.1 schriftlich belegt wurde.
     * Hierfür kommen Fremdsprachen und ggf. ein bilinguales Sachfach in Frage, dessen Unterrichtssprache
     * nicht durchgehend schriftlich belegt.
     *
     * @return die Anzahl der durchgehend schriftlich belegten bzw. belegbaren Fremdsprachen zurück.
     */
    getAnzahlDurchgehendSchritflichBelegt() {
        return this.anzahl_schriftlich_durchgehend;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.abschluss.gost.belegpruefung.Fremdsprachen', 'de.nrw.schule.svws.core.abschluss.gost.GostBelegpruefung'].includes(name);
    }
}
exports.Fremdsprachen = Fremdsprachen;
function cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Fremdsprachen(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Fremdsprachen = cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Fremdsprachen;
//# sourceMappingURL=Fremdsprachen.js.map