"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_abschluss_ge_ServicePrognose = exports.ServicePrognose = void 0;
const JavaObject_1 = require("../../../java/lang/JavaObject");
const ServiceAbschlussHA10_1 = require("../../../core/abschluss/ge/ServiceAbschlussHA10");
const Service_1 = require("../../../core/Service");
const ServiceBerechtigungMSAQ_1 = require("../../../core/abschluss/ge/ServiceBerechtigungMSAQ");
const LogLevel_1 = require("../../../logger/LogLevel");
const ServiceAbschlussMSA_1 = require("../../../core/abschluss/ge/ServiceAbschlussMSA");
const Abschluss_1 = require("../../../core/types/Abschluss");
const AbschlussManager_1 = require("../../../core/abschluss/AbschlussManager");
const ServiceAbschlussHA9_1 = require("../../../core/abschluss/ge/ServiceAbschlussHA9");
class ServicePrognose extends Service_1.Service {
    constructor() {
        super();
    }
    /**
     * Prüft, ob Lernbereichsnoten bei den Sbchlussfächern zur Verfügung stehen oder nicht.
     *
     * @param faecher   die Abschlussfächer
     *
     * @return true, falls die Lernbereichsnoten vorhanden sind, ansonsten false
     */
    static hatLernbereichsnoten(faecher) {
        let hatLBNW = false;
        let hatLBAL = false;
        if (faecher.faecher === null)
            return false;
        let tmp = faecher.faecher;
        for (let fach of tmp) {
            if (fach === null)
                continue;
            hatLBNW = hatLBNW || JavaObject_1.JavaObject.equalsTranspiler("LBNW", (fach.kuerzel));
            hatLBAL = hatLBAL || JavaObject_1.JavaObject.equalsTranspiler("LBAL", (fach.kuerzel));
        }
        return hatLBNW && hatLBAL;
    }
    /**
     * Führt die Prognoseberechnung anhand der übergebenen Abschlussfächer durch
     * und gibt das Berechnungsergebnis zurück.
     *
     * @param input    die Abschlussfächer
     *
     * @return das Ergebnis der Prognoseberechnung
     */
    handle(input) {
        if (!AbschlussManager_1.AbschlussManager.pruefeHat4LeistungsdifferenzierteFaecher(input)) {
            this.logger.logLn(LogLevel_1.LogLevel.DEBUG, "Fehler: Es wurden nicht genügend leistungsdiffernzierte Fächer gefunden.");
            let prognose = AbschlussManager_1.AbschlussManager.getErgebnis(null, false);
            prognose.log = this.log.getStrings();
            return prognose;
        }
        if (!AbschlussManager_1.AbschlussManager.pruefeKuerzelDuplikate(input)) {
            this.logger.logLn(LogLevel_1.LogLevel.DEBUG, "Fehler: Es wurden Fächer mit dem gleichen Kürzel zur Abschlussprüfung übergeben. Dies ist nicht zulässig.");
            let prognose = AbschlussManager_1.AbschlussManager.getErgebnis(null, false);
            prognose.log = this.log.getStrings();
            return prognose;
        }
        let abschluss = Abschluss_1.Abschluss.OHNE_ABSCHLUSS;
        let np_faecher = null;
        if (!JavaObject_1.JavaObject.equalsTranspiler("10", (input.jahrgang))) {
            let ha9 = new ServiceAbschlussHA9_1.ServiceAbschlussHA9();
            let ha9output = ha9.handle(input);
            np_faecher = ha9output.npFaecher;
            if (ha9output.erworben)
                abschluss = Abschluss_1.Abschluss.HA9;
            this.log.append(ha9.getLog());
            this.logger.logLn(LogLevel_1.LogLevel.INFO, "");
        }
        else if (JavaObject_1.JavaObject.equalsTranspiler("10", (input.jahrgang))) {
            abschluss = Abschluss_1.Abschluss.HA9;
        }
        let ha10 = new ServiceAbschlussHA10_1.ServiceAbschlussHA10();
        let ha10output = ha10.handle(input);
        if (ha10output.erworben)
            abschluss = Abschluss_1.Abschluss.HA10;
        else if (JavaObject_1.JavaObject.equalsTranspiler("10", (input.jahrgang)) || (JavaObject_1.JavaObject.equalsTranspiler(Abschluss_1.Abschluss.HA9, (abschluss))))
            np_faecher = ha10output.npFaecher;
        this.log.append(ha10.getLog());
        if ((!JavaObject_1.JavaObject.equalsTranspiler(Abschluss_1.Abschluss.OHNE_ABSCHLUSS, (abschluss))) || (!ServicePrognose.hatLernbereichsnoten(input))) {
            let msa = new ServiceAbschlussMSA_1.ServiceAbschlussMSA();
            let msaOutput = msa.handle(input);
            this.logger.logLn(LogLevel_1.LogLevel.INFO, "");
            this.log.append(msa.getLog());
            if (msaOutput.erworben) {
                abschluss = Abschluss_1.Abschluss.MSA;
                let msaq = new ServiceBerechtigungMSAQ_1.ServiceBerechtigungMSAQ();
                let msaqOutput = msaq.handle(input);
                if (msaqOutput.erworben) {
                    abschluss = Abschluss_1.Abschluss.MSA_Q;
                }
                else {
                    np_faecher = msaqOutput.npFaecher;
                }
                this.logger.logLn(LogLevel_1.LogLevel.INFO, "");
                this.log.append(msaq.getLog());
            }
            else {
                np_faecher = msaOutput.npFaecher;
            }
        }
        let prognose = AbschlussManager_1.AbschlussManager.getErgebnisNachpruefung(abschluss, np_faecher);
        prognose.erworben = (!JavaObject_1.JavaObject.equalsTranspiler(Abschluss_1.Abschluss.OHNE_ABSCHLUSS, (abschluss)));
        prognose.log = this.log.getStrings();
        return prognose;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.Service', 'de.nrw.schule.svws.core.abschluss.ge.ServicePrognose'].includes(name);
    }
}
exports.ServicePrognose = ServicePrognose;
function cast_de_nrw_schule_svws_core_abschluss_ge_ServicePrognose(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_abschluss_ge_ServicePrognose = cast_de_nrw_schule_svws_core_abschluss_ge_ServicePrognose;
//# sourceMappingURL=ServicePrognose.js.map