import { JavaObject, cast_java_lang_Object } from '../../java/lang/JavaObject';
import { KursblockungOutput, cast_de_nrw_schule_svws_core_data_kursblockung_KursblockungOutput } from '../../core/data/kursblockung/KursblockungOutput';
import { KursblockungOutputs, cast_de_nrw_schule_svws_core_data_kursblockung_KursblockungOutputs } from '../../core/data/kursblockung/KursblockungOutputs';
import { KursblockungInput, cast_de_nrw_schule_svws_core_data_kursblockung_KursblockungInput } from '../../core/data/kursblockung/KursblockungInput';
import { KursblockungAlgorithmusS, cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusS } from '../../core/kursblockung/KursblockungAlgorithmusS';
import { KursblockungAlgorithmusKMatching, cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKMatching } from '../../core/kursblockung/KursblockungAlgorithmusKMatching';
import { KursblockungDynDaten, cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynDaten } from '../../core/kursblockung/KursblockungDynDaten';
import { Service, cast_de_nrw_schule_svws_core_Service } from '../../core/Service';
import { KursblockungAlgorithmusSZufaellig, cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig } from '../../core/kursblockung/KursblockungAlgorithmusSZufaellig';
import { KursblockungAlgorithmusK, cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusK } from '../../core/kursblockung/KursblockungAlgorithmusK';
import { Vector, cast_java_util_Vector } from '../../java/util/Vector';
import { System, cast_java_lang_System } from '../../java/lang/System';

export class KursblockungAlgorithmus extends Service<KursblockungInput, KursblockungOutputs> {


	public constructor() {
		super();
	}

	public handle(input : KursblockungInput) : KursblockungOutputs {
		this.logger.modifyIndent(+4);
		let kursblockungOutputs : KursblockungOutputs = new KursblockungOutputs();
		kursblockungOutputs.outputs = new Vector();
		let dynDaten : KursblockungDynDaten = new KursblockungDynDaten(this.logger, input);
		let timeMaxGlobal : number = dynDaten.gibBlockungszeitMillis();
		let algorithmenK : Array<KursblockungAlgorithmusK> = [new KursblockungAlgorithmusKMatching(this.logger, dynDaten)];
		let algorithmenS : Array<KursblockungAlgorithmusS> = [new KursblockungAlgorithmusSZufaellig(this.logger, dynDaten, false)];
		let timeStart : number = System.currentTimeMillis();
		let timeMaxLocal : number = 1000;
		do {
			for (let iK : number = 0; iK < algorithmenK.length; iK++){
				for (let iS : number = 0; iS < algorithmenS.length; iS++){
					algorithmenK[iK].berechne(timeMaxLocal);
					algorithmenS[iS].berechne(timeMaxLocal);
					let out : KursblockungOutput = dynDaten.gibErzeugtesKursblockungOutput();
					kursblockungOutputs.outputs.add(out);
				}
			}
			timeMaxLocal += 100;
		} while (System.currentTimeMillis() - timeStart < timeMaxGlobal);
		this.logger.modifyIndent(-4);
		return kursblockungOutputs;
	}

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

}

export function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmus(obj : unknown) : KursblockungAlgorithmus {
	return obj as KursblockungAlgorithmus;
}
