"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_types_gost_GostHalbjahr = exports.GostHalbjahr = void 0;
const JavaObject_1 = require("../../../java/lang/JavaObject");
const JavaInteger_1 = require("../../../java/lang/JavaInteger");
const HashMap_1 = require("../../../java/util/HashMap");
const Arrays_1 = require("../../../java/util/Arrays");
const IllegalArgumentException_1 = require("../../../java/lang/IllegalArgumentException");
class GostHalbjahr extends JavaObject_1.JavaObject {
    static map = new HashMap_1.HashMap();
    static mapKuerzel = new HashMap_1.HashMap();
    static mapKuerzelAlt = new HashMap_1.HashMap();
    static maxHalbjahre = 6;
    static EF1 = new GostHalbjahr(0, "EF", 1, "EF.1", "E1", "Einführungsphase 1. Halbjahr");
    static EF2 = new GostHalbjahr(1, "EF", 2, "EF.2", "E2", "Einführungsphase 2. Halbjahr");
    static Q11 = new GostHalbjahr(2, "Q1", 1, "Q1.1", "Q1", "Qualifikationsphase 1. Jahr, 1. Halbjahr");
    static Q12 = new GostHalbjahr(3, "Q1", 2, "Q1.2", "Q2", "Qualifikationsphase 1. Jahr, 2. Halbjahr");
    static Q21 = new GostHalbjahr(4, "Q2", 1, "Q2.1", "Q3", "Qualifikationsphase 2. Jahr, 1. Halbjahr");
    static Q22 = new GostHalbjahr(5, "Q2", 2, "Q2.2", "Q4", "Qualifikationsphase 2. Jahr, 2. Halbjahr");
    id;
    jahrgang;
    halbjahr;
    kuerzel;
    kuerzelAlt;
    beschreibung;
    /**
     * Erzeugt ein neues Halbjahr der Gymnasialen Oberstufe für diese Aufzählung.
     *
     * @param id             die ID für das Halbjahr, welches die Reihenfolge der Halbjahre wiederspiegelt
     * @param jahrgang       das Jahrgangskürzel des Halbjahres
     * @param halbjahr       die Nummer des Halbjahres
     * @param kuerzel        das eindeutige Kürzel für das Halbjahr der gymnasialen Oberstufe
     * @param kuerzelAlt     ein eindeutiges Kürzel, welche in alten Tabellen verwendet wurde.
     * @param beschreibung   die textuelle Beschreibung für das Halbjahr der gymnasialen Oberstufe
     */
    constructor(id, jahrgang, halbjahr, kuerzel, kuerzelAlt, beschreibung) {
        super();
        this.id = id;
        this.jahrgang = jahrgang;
        this.halbjahr = halbjahr;
        this.kuerzel = kuerzel;
        this.kuerzelAlt = kuerzelAlt;
        this.beschreibung = beschreibung;
        GostHalbjahr.map.put(id, this);
        GostHalbjahr.mapKuerzel.put(kuerzel, this);
        GostHalbjahr.mapKuerzelAlt.put(kuerzelAlt, this);
    }
    /**
     * Gibt das nachfolgende Halbjahr zurück.
     *
     * @return das nachfolgende Halbjahr oder null, wenn es keines mehr gibt
     */
    next() {
        return GostHalbjahr.map.get(this.id + 1);
    }
    /**
     * Gibt das vorherige Halbjahr zurück.
     *
     * @return das vorherige Halbjahr oder null, wenn es keines mehr gibt
     */
    previous() {
        return GostHalbjahr.map.get(this.id - 1);
    }
    /**
     * Gibt alle Halbjahre zurück.
     *
     * @return ein Array mit allen Halbjahren der gymnasialen Oberstufe
     */
    static values() {
        let alle = [GostHalbjahr.EF1, GostHalbjahr.EF2, GostHalbjahr.Q11, GostHalbjahr.Q12, GostHalbjahr.Q21, GostHalbjahr.Q22];
        return alle;
    }
    /**
     * Gibt alle Halbjahre der Einführungsphase zurück.
     *
     * @return ein Array mit allen Halbjahren der Einführungsphase der gymnasialen Oberstufe
     */
    static getEinfuehrungsphase() {
        let ef = [GostHalbjahr.EF1, GostHalbjahr.EF2];
        return ef;
    }
    /**
     * Gibt alle Halbjahre der Qualifikationsphase zurück.
     *
     * @return ein Array mit allen Halbjahren der Qualifikationsphase der gymnasialen Oberstufe
     */
    static getQualifikationsphase() {
        let q = [GostHalbjahr.Q11, GostHalbjahr.Q12, GostHalbjahr.Q21, GostHalbjahr.Q22];
        return q;
    }
    /**
     * Gibt alle Halbjahre des übergebenen Jahrgangs zurück.
     *
     * @param jahrgang     der Jahrgang
     *
     * @return ein Array mit den Halbjahren des Jahrgangs
     */
    static getHalbjahreFromJahrgang(jahrgang) {
        switch (jahrgang) {
            case "EF":
                let ef = [GostHalbjahr.EF1, GostHalbjahr.EF2];
                return ef;
            case "Q1":
                let q1 = [GostHalbjahr.Q11, GostHalbjahr.Q12];
                return q1;
            case "Q2":
                let q2 = [GostHalbjahr.Q21, GostHalbjahr.Q22];
                return q2;
        }
        throw new IllegalArgumentException_1.IllegalArgumentException("Der angegebene Jahrgang ist kein gültiger Jahrgang der gymnasialen Oberstufe");
    }
    /**
     * Gibt das Halbjahr zurück, welches die übergebene ID hat.
     *
     * @param id   die ID des Halbjahres
     *
     * @return das Halbjahr oder null, falls die ID nicht gültig ist
     */
    static fromID(id) {
        if (id === null)
            return null;
        switch (id) {
            case 0:
                return GostHalbjahr.EF1;
            case 1:
                return GostHalbjahr.EF2;
            case 2:
                return GostHalbjahr.Q11;
            case 3:
                return GostHalbjahr.Q12;
            case 4:
                return GostHalbjahr.Q21;
            case 5:
                return GostHalbjahr.Q22;
        }
        return null;
    }
    /**
     * Gibt das Halbjahr zurück, welches das übergebene Kürzel hat.
     *
     * @param kuerzel   das Kürzel
     *
     * @return das Halbjahr oder null, falls das Kürzel nicht gültig ist
     */
    static fromKuerzel(kuerzel) {
        return GostHalbjahr.mapKuerzel.get(kuerzel);
    }
    /**
     * Gibt das Halbjahr zurück, welches das übergebene alte Kürzel hat.
     *
     * @param kuerzelAlt   das alte Kürzel
     *
     * @return das Halbjahr oder null, falls das Kürzel nicht gültig ist
     */
    static fromKuerzelAlt(kuerzelAlt) {
        return GostHalbjahr.mapKuerzelAlt.get(kuerzelAlt);
    }
    /**
     * Gibt das Halbjahr zurück, welches zu dem übergebenen Jahrgang und Halbjahr gehört.
     *
     * @param jahrgang     der Jahrgang
     * @param halbjahr     die Nummer des Halbjahres
     *
     * @return das Halbjahr oder null, falls es kein gültiges Halbjahr mit den Angaben gibt.
     */
    static fromJahrgangUndHalbjahr(jahrgang, halbjahr) {
        if ((halbjahr !== 1) && (halbjahr !== 2))
            return null;
        switch (jahrgang) {
            case "EF":
                return (halbjahr === 1) ? GostHalbjahr.EF1 : GostHalbjahr.EF2;
            case "Q1":
                return (halbjahr === 1) ? GostHalbjahr.Q11 : GostHalbjahr.Q12;
            case "Q2":
                return (halbjahr === 1) ? GostHalbjahr.Q21 : GostHalbjahr.Q22;
        }
        return null;
    }
    /**
     * Ermittelt das Halbjahr der gymnasialen Oberstufe anhand des angegegebenen Abiturjahres und
     * dem aktuellen Schuljahr und Halbjahr
     *
     * @param abiturjahr   das Abiturjahr
     * @param schuljahr    das aktuelle Schuljahr
     * @param halbjahr     das aktuelle Halbjahr
     *
     * @return das Halbjahr der gymnasialen Oberstufe oder null
     */
    static fromAbiturjahrSchuljahrUndHalbjahr(abiturjahr, schuljahr, halbjahr) {
        let id = ((schuljahr + 3 - abiturjahr) * 2) + halbjahr - 1;
        return GostHalbjahr.fromID(id);
    }
    /**
     * Bestimmt das Halbjahr der gymnasialen Oberstufe anhand des angegegebenen Abiturjahres und
     * dem aktuellen Schuljahr und Halbjahr und gibt anhand dessen das Halbjahr der gymnasialen
     * Oberstufe zurück, welches als nächstes geplant wird.
     *
     * @param abiturjahr   das Abiturjahr
     * @param schuljahr    das aktuelle Schuljahr
     * @param halbjahr     das aktuelle Halbjahr
     *
     * @return das nächste Halbjahr der gymnasialen Oberstufe zur Planung oder null, wenn der
     *         Jahrgang in der Q2.2 ist oder das Abitur bereits abgeschlossen ist.
     */
    static getPlanungshalbjahrFromAbiturjahrSchuljahrUndHalbjahr(abiturjahr, schuljahr, halbjahr) {
        let id = ((schuljahr + 3 - abiturjahr) * 2) + halbjahr;
        if (id < 0)
            id = 0;
        return GostHalbjahr.fromID(id);
    }
    /**
     * Gibt zurück, ob es Einführungsphase ist.
     *
     * @return  Einführungsphase, true oder false
     */
    istEinfuehrungsphase() {
        return JavaObject_1.JavaObject.equalsTranspiler("EF", (this.jahrgang));
    }
    /**
     * Gibt zurück, ob es Qualifikationsphase ist.
     *
     * @return  Qualifikationsphase, true oder false
     */
    istQualifikationsphase() {
        return !this.istEinfuehrungsphase();
    }
    /**
     * Prüft anhand der übergebenen Halbjahre, ob es sich um die beiden Halbjahre
     * der Einführungsphase handelt.
     *
     * @param halbjahre    die Halbjahre
     *
     * @return true, wenn es sich um die beiden Halbjahre der Einführungsphase handelt
     *         und ansonsten false
     */
    static pruefeEinfuehrungsphase(...halbjahre) {
        if ((halbjahre === null) || (halbjahre.length !== 2))
            return false;
        return ((halbjahre[0] === GostHalbjahr.EF1) && (halbjahre[0] === GostHalbjahr.EF2)) || ((halbjahre[0] === GostHalbjahr.EF2) && (halbjahre[0] === GostHalbjahr.EF1));
    }
    /**
     * Prüft anhand der übergebenen Halbjahre, ob es sich um die vier Halbjahre
     * der Qualifikationsphase handelt.
     *
     * @param halbjahre    die Halbjahre
     *
     * @return true, wenn es sich um die vier Halbjahre der Qualifikationsphase
     *         handelt und ansonsten false
     */
    static pruefeQualifikationsphase(...halbjahre) {
        if ((halbjahre === null) || (halbjahre.length !== 4))
            return false;
        let list = Arrays_1.Arrays.asList(...halbjahre);
        return (list.contains(GostHalbjahr.Q11) && list.contains(GostHalbjahr.Q12) && list.contains(GostHalbjahr.Q21) && list.contains(GostHalbjahr.Q22));
    }
    compareTo(other) {
        if (other === null)
            return -1;
        return JavaInteger_1.JavaInteger.compare(this.id, other.id);
    }
    isTranspiledInstanceOf(name) {
        return ['java.lang.Comparable', 'de.nrw.schule.svws.core.types.gost.GostHalbjahr'].includes(name);
    }
}
exports.GostHalbjahr = GostHalbjahr;
function cast_de_nrw_schule_svws_core_types_gost_GostHalbjahr(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_types_gost_GostHalbjahr = cast_de_nrw_schule_svws_core_types_gost_GostHalbjahr;
//# sourceMappingURL=GostHalbjahr.js.map