"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_types_statkue_Schulform = exports.Schulform = void 0;
const JavaObject_1 = require("../../../java/lang/JavaObject");
const HashMap_1 = require("../../../java/util/HashMap");
const Schulgliederung_1 = require("../../../core/types/statkue/Schulgliederung");
const Vector_1 = require("../../../java/util/Vector");
class Schulform extends JavaObject_1.JavaObject {
    /** the name of the enumeration value */
    __name;
    /** the ordinal value for the enumeration value */
    __ordinal;
    /** an array containing all values of this enumeration */
    static all_values_by_ordinal = [];
    /** an array containing all values of this enumeration indexed by their name*/
    static all_values_by_name = new Map();
    static AS = new Schulform("AS", 0, "AS", null, "Ausländische Schüler, die zugewandert sind", null, null);
    static BK = new Schulform("BK", 1, "BK", "30", "Berufskolleg", null, null);
    static FW = new Schulform("FW", 2, "FW", "17", "Freie Waldorfschule / Hibernia", null, null);
    static G = new Schulform("G", 3, "G", "02", "Grundschule", null, null);
    static GE = new Schulform("GE", 4, "GE", "15", "Gesamtschule", null, null);
    static GM = new Schulform("GM", 5, "GM", "16", "Gemeinschaftsschule", null, null);
    static GY = new Schulform("GY", 6, "GY", "20", "Gymnasium", null, null);
    static H = new Schulform("H", 7, "H", "04", "Hauptschule", null, null);
    static HU = new Schulform("HU", 8, "HU", null, "Hochschule, Universität", null, null);
    static LB = new Schulform("LB", 9, "LB", null, "Förderschule, Schwerpunkt Lernen", null, null);
    static PS = new Schulform("PS", 10, "PS", "13", "Schulversuch PRIMUS", null, null);
    static R = new Schulform("R", 11, "R", "10", "Realschule", null, null);
    static S = new Schulform("S", 12, "S", "08", "Förderschule im Bereich G/H / Schule für Kranke", null, null);
    static SB = new Schulform("SB", 13, "SB", "88", "Förderschule im Bereich Berufskolleg", null, null);
    static SG = new Schulform("SG", 14, "SG", "87", "Förderschule im Bereich Gymnasium", null, null);
    static SK = new Schulform("SK", 15, "SK", "14", "Sekundarschule", null, null);
    static SO = new Schulform("SO", 16, "SO", null, "Sonstige Förderschulen", null, null);
    static SP = new Schulform("SP", 17, "SP", null, "Ausgesiedelte Schüler, die zugewandert sind", null, null);
    static SR = new Schulform("SR", 18, "SR", "85", "Förderschule im Bereich Realschule", null, null);
    static V = new Schulform("V", 19, "V", "06", "nicht umorganisierte Volksschule", null, null);
    static WB = new Schulform("WB", 20, "WB", "25", "Weiterbildungskolleg", null, null);
    static WZ = new Schulform("WZ", 21, "WZ", null, "Wehrdienst bzw. Zivildienst", null, null);
    static XB = new Schulform("XB", 22, "XB", null, "Berufstätigkeit, z.B. vor Besuch einer Fachschule", null, null);
    static XS = new Schulform("XS", 23, "XS", null, "Sonstige Schulen bzw. keine Schule", null, null);
    static _schulformen = new HashMap_1.HashMap();
    static _schulformenNummer = new HashMap_1.HashMap();
    kuerzel;
    nummer;
    bezeichnung;
    hatGymOb;
    gueltigVon;
    gueltigBis;
    /**
     * Erzeugt eine neue Schulform in der Aufzählung.
     *
     * @param kuerzel           das Kürzel, welche im Rahmen der amtlichen Schulstatistik verwendet wird
     * @param nummer            die Nummer, welche im Rahmen der amtlichen Schulstatistik verwendet wird
     * @param bezeichnung       die textuelle Bezeichnung der Schulform
     * @param gueltigVon        gibt an, wann die Schulform einführt wurde - ist kein Datum bekannt, so wird null gesetzt
     * @param gueltigBis        gibt an, bis wann die Schulform gültig ist - ist kein Datum bekannt, so wird null gesetzt
     */
    constructor(name, ordinal, kuerzel, nummer, bezeichnung, gueltigVon, gueltigBis) {
        super();
        this.__name = name;
        this.__ordinal = ordinal;
        Schulform.all_values_by_ordinal.push(this);
        Schulform.all_values_by_name.set(name, this);
        this.kuerzel = kuerzel;
        this.nummer = nummer;
        this.bezeichnung = bezeichnung;
        this.hatGymOb = JavaObject_1.JavaObject.equalsTranspiler("GY", (kuerzel)) || JavaObject_1.JavaObject.equalsTranspiler("GE", (kuerzel)) || JavaObject_1.JavaObject.equalsTranspiler("FW", (kuerzel));
        this.gueltigVon = gueltigVon;
        this.gueltigBis = gueltigBis;
    }
    /**
     * Gibt eine Map von den Kürzels der Schulformen auf die zugehörigen Schulformen
     * zurück. Sollte diese noch nicht initialisiert sein, so wird sie initielisiert.
     *
     * @return die Map von den Kürzels der Schulformen auf die zugehörigen Schulformen
     */
    static getMapSchulformenByKuerzel() {
        if (Schulform._schulformen.size() === 0)
            for (let s of Schulform.values())
                Schulform._schulformen.put(s.kuerzel, s);
        return Schulform._schulformen;
    }
    /**
     * Gibt eine Map von den Kürzels der Schulformen auf die zugehörigen Schulformen
     * zurück. Sollte diese noch nicht initialisiert sein, so wird sie initielisiert.
     *
     * @return die Map von den Kürzels der Schulformen auf die zugehörigen Schulformen
     */
    static getMapSchulformenByNummer() {
        if (Schulform._schulformenNummer.size() === 0)
            for (let s of Schulform.values())
                if (s.nummer !== null)
                    Schulform._schulformenNummer.put(s.nummer, s);
        return Schulform._schulformenNummer;
    }
    /**
     * Gibt die Schulform für das angegebene Kürzel zurück.
     *
     * @param kuerzel   das Kürzel der Schulform
     *
     * @return die Schulform oder null, falls das Kürzel ungültig ist
     */
    static getByKuerzel(kuerzel) {
        return Schulform.getMapSchulformenByKuerzel().get(kuerzel);
    }
    /**
     * Gibt die Schulform für die angegebene Nummer zurück.
     *
     * @param nummer   die Nummer der Schulform
     *
     * @return die Schulform oder null, falls keine Schulform mit dieser Nummer vorhanden ist
     */
    static getByNummer(nummer) {
        return Schulform.getMapSchulformenByNummer().get(nummer);
    }
    /**
     * Gibt alle "echten" Schulformen dieser Aufzählung zurück.
     * Das bedeutet, dass Pseudoschulformen, die in NRW nicht
     * existieren, nicht zurückgegeben werden.
     *
     * @return eine {@link List} mit alle "echten" Schulformen
     */
    static get() {
        let result = new Vector_1.Vector();
        for (let sf of Schulform.values())
            if (sf.nummer !== null)
                result.add(sf);
        return result;
    }
    /**
     * Bestimmt für diese Schulform, die übergebene Schulgliederung (auch beim Schüler eingetragenen Schulgliederung)
     * und den angegebenen Jahrgang die restlichen Jahre an der Schule.
     * Ist keine Berechnung für diese Kombination implementiert,
     * so wird null zurückgegeben.
     *
     * @param gliederung   die Schulgliederung
     * @param jahrgang     der Jahrgang, für den die restlichen Jahre bestimmt werden sollen
     *
     * @return die restlichen Jahre oder null
     */
    getRestlicheJahre(gliederung, jahrgang) {
        if (gliederung === null)
            return null;
        if ((this === Schulform.FW) || (this === Schulform.WB) || (this === Schulform.BK) || (this === Schulform.SB))
            return null;
        if (this === Schulform.GY) {
            switch (jahrgang) {
                case "05":
                    return gliederung.istG8() || (gliederung === Schulgliederung_1.Schulgliederung.DEFAULT) ? 8 : 9;
                case "06":
                    return gliederung.istG8() || (gliederung === Schulgliederung_1.Schulgliederung.DEFAULT) ? 7 : 8;
                case "07":
                    return gliederung.istG8() || (gliederung === Schulgliederung_1.Schulgliederung.DEFAULT) ? 6 : 7;
                case "08":
                    return gliederung.istG8() || (gliederung === Schulgliederung_1.Schulgliederung.DEFAULT) ? 5 : 6;
                case "09":
                    return gliederung.istG8() || (gliederung === Schulgliederung_1.Schulgliederung.DEFAULT) ? 4 : 5;
                case "10":
                    return gliederung.istG8() ? null : 4;
                case "EF":
                    return 3;
                case "Q1":
                    return 2;
                case "Q2":
                    return 1;
                case "11":
                    return 3;
                case "12":
                    return 2;
                case "13":
                    return 1;
            }
        }
        else {
            switch (jahrgang) {
                case "E1":
                    return 4;
                case "E2":
                    return 3;
                case "E3":
                    return 3;
                case "03":
                    return 2;
                case "04":
                    return 1;
                case "05":
                    return 6;
                case "06":
                    return 5;
                case "07":
                    return 4;
                case "08":
                    return 3;
                case "09":
                    return 2;
                case "10":
                    return 1;
                case "EF":
                    return 3;
                case "Q1":
                    return 2;
                case "Q2":
                    return 1;
                case "11":
                    return 3;
                case "12":
                    return 2;
                case "13":
                    return 1;
            }
        }
        return null;
    }
    /**
     * Bestimmt für das übergegebene Schuljahr eines Schülers das Kalenderjahr, in welchem ein Schüler
     * der gymnasialen Oberstufe Abitur gemacht hat, macht oder machen wird. Hierbei wird für die
     * Bestimmung die Schulgliederung bei dem Schüler sowie das aktuelle Schuljahr und der
     * Statistik-Jahrgang, in welchem sich der Schüler befindet, benötigt.
     *
     * @param gliederung           die Schul-Gliederung des Schülers
     * @param aktuellesSchuljahr   das aktuelle Schuljahr, in welchem sich der Schüler befindet
     * @param jahrgang             der Statistik-Jahrgang des Schülers
     *
     * @return das Kalenderjahr des Abiturs oder null, falls das Jahr des Abiturs nicht bestimmt werden kann.
     */
    getGostAbiturjahr(gliederung, aktuellesSchuljahr, jahrgang) {
        if (!this.hatGymOb)
            return null;
        let restjahre = this.getRestlicheJahre(gliederung, jahrgang);
        return restjahre === null ? null : aktuellesSchuljahr + restjahre.valueOf();
    }
    /**
     * Bestimmt für das angegebene Abiturjahr, das angegebene aktuelles Schuljahr, in dem sich die
     * Schule befindet, und der angegebenen Schulgliederung den zugrhörigen Statistik-Jahrgang
     * einer Schule mit gymnasialer Oberstufe.
     *
     * @param gliederung    die Schulgliederung
     * @param schuljahr     das Schuljahr, in dem sich die Schule befindet
     * @param abiturjahr    das Abiturjahr, für welches der Statistik-Jahrgang ermittelt werden soll.
     *
     * @return der Statistik-Jahrgang zu dem angegeben Abiturjahrgang
     */
    getGostAbiturjahrJahrgang(gliederung, schuljahr, abiturjahr) {
        if (!this.hatGymOb)
            return null;
        let restlicheJahre = abiturjahr - schuljahr;
        if (restlicheJahre <= 1)
            return "Q2";
        if (restlicheJahre === 2)
            return "Q1";
        if (restlicheJahre === 3)
            return "EF";
        let sekIJahre = gliederung.istG8() || ((this === Schulform.GY) && (gliederung === Schulgliederung_1.Schulgliederung.DEFAULT)) ? 9 : 10;
        if (restlicheJahre >= sekIJahre)
            return null;
        let strJG = "" + (sekIJahre - (restlicheJahre - 4));
        if (strJG.length === 1)
            strJG = "0" + strJG.valueOf();
        return strJG;
    }
    /**
     * Returns the name of this enumeration value.
     *
     * @returns the name
     */
    name() {
        return this.__name;
    }
    /**
     * Returns the ordinal value of this enumeration value.
     *
     * @returns the ordinal value
     */
    ordinal() {
        return this.__ordinal;
    }
    /**
     * Returns the name of this enumeration value.
     *
     * @returns the name
     */
    toString() {
        return this.__name;
    }
    /**
     * Returns true if this and the other enumeration values are equal.
     *
     * @param other   the other enumeration value
     *
     * @returns true if they are equal and false otherwise
     */
    equals(other) {
        if (!(other instanceof Schulform))
            return false;
        return this === other;
    }
    /**
     * Returns the ordinal value as hashcode, since the ordinal value is unique.
     *
     * @returns the ordinal value as hashcode
     */
    hashCode() {
        return this.__ordinal;
    }
    /**
     * Compares this enumeration value with the other enumeration value by their ordinal value.
     *
     * @param other   the other enumeration value
     *
     * @returns a negative, zero or postive value as this enumeration value is less than, equal to
     *          or greater than the other enumeration value
     */
    compareTo(other) {
        return this.__ordinal - other.__ordinal;
    }
    /**
     * Returns an array with enumeration values.
     *
     * @returns the array with enumeration values
     */
    static values() {
        return [...this.all_values_by_ordinal];
    }
    /**
     * Returns the enumeration value with the specified name.
     *
     * @param name   the name of the enumeration value
     *
     * @returns the enumeration values or null
     */
    static valueOf(name) {
        let tmp = this.all_values_by_name.get(name);
        return (!tmp) ? null : tmp;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.types.statkue.Schulform'].includes(name);
    }
}
exports.Schulform = Schulform;
function cast_de_nrw_schule_svws_core_types_statkue_Schulform(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_types_statkue_Schulform = cast_de_nrw_schule_svws_core_types_statkue_Schulform;
//# sourceMappingURL=Schulform.js.map