import { JavaObject, cast_java_lang_Object } from '../../java/lang/JavaObject';
import { KursblockungDynDaten, cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynDaten } from '../../core/kursblockung/KursblockungDynDaten';
import { Logger, cast_de_nrw_schule_svws_logger_Logger } from '../../logger/Logger';

export abstract class KursblockungAlgorithmusS extends JavaObject {

	protected readonly logger : Logger;

	protected readonly dynDaten : KursblockungDynDaten;


	/**
	 * Der Konstruktor stellt einen Logger und die bei der Blockung benötigten
	 * dynamischen Daten den Unterklassen zur Verfügung.
	 * 
	 * @param logger   Logger für Benutzerhinweise, Warnungen und Fehler.
	 * @param dynDaten Die aktuellen Blockunsdaten.
	 */
	public constructor(logger : Logger, dynDaten : KursblockungDynDaten) {
		super();
		this.logger = logger;
		this.dynDaten = dynDaten;
	}

	/**
	 * Eine Unterklasse, die diese Methode implementiert, berechnet eine Verteilung
	 * der SuS auf die Kurse.
	 * 
	 * @param pMaxTimeMillis Die maximale Berechnungszeit in Millisekunden.
	 */
	public abstract berechne(pMaxTimeMillis : number) : void;

	isTranspiledInstanceOf(name : string): boolean {
		return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusS'].includes(name);
	}

}

export function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusS(obj : unknown) : KursblockungAlgorithmusS {
	return obj as KursblockungAlgorithmusS;
}
