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 KursblockungAlgorithmusK 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 pLogger   Logger für Benutzerhinweise, Warnungen und Fehler.
	 * @param pDynDaten Die aktuellen Blockunsdaten.
	 */
	public constructor(pLogger : Logger, pDynDaten : KursblockungDynDaten) {
		super();
		this.logger = pLogger;
		this.dynDaten = pDynDaten;
	}

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

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

}

export function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusK(obj : unknown) : KursblockungAlgorithmusK {
	return obj as KursblockungAlgorithmusK;
}
