class ReservationManager {
	static getAccessLevelForCode(code, callback, errorCallback) {
		this.accessCallback = callback;
		this.accessErrorCallback = errorCallback;

		new Request(FrouMonk.REQUEST_URI + "Api/VerifyAccessCode", Request.POST, this.accessCallback, this.accessErrorCallback).send({
			code
		});
	}

	static loadReservations(callback) {
		if (!ReservationManager.callbacks) {
			ReservationManager.callbacks = [ ];
		}
		ReservationManager.callbacks.push(callback);

		if (!ReservationManager.reservations) {
			new Request(FrouMonk.REQUEST_URI + "Api/Reservations", Request.GET, ReservationManager.onReservationsLoaded, ReservationManager.onReservationLoadingError).send({
				code: localStorage.code
			});
		}
		else {
			callback(ReservationManager.reservations);
		}
	}

	static onReservationsLoaded(data) {
		ReservationManager.reservations = data;
		
		if (ReservationManager.callbacks) {
			for (var i = 0; i < ReservationManager.callbacks.length; i++) {
				ReservationManager.callbacks[i]();
			}
		}

		ReservationManager.callbacks = null;
	}

	static onReservationLoadingError(request, status, error) {
		if (error.code == "no_code_provided") {
			alert("Du musst dich anmelden.");
		}
		else {
			alert("Fehler: " + error.message);
		}
	}

	static performReservation(data, successCallback, errorCallback) {
		new Request(FrouMonk.REQUEST_URI + "Api/Reservation/Create", Request.POST, successCallback, errorCallback).send(data);
	}

	static getReservationStatusForDate(date) {
		if (!ReservationManager.reservations) {
			return 0;
		}

		var dateTime = date.getTime();

		for (var i = 0; i < ReservationManager.reservations.length; i++) {
			var reservarion = ReservationManager.reservations[i];

			var startDate = new Date(reservarion.fromdate.replace(" ", "T"));
			var endDate = new Date(reservarion.todate.replace(" ", "T"));

			var startTime = startDate.getTime() - (startDate.getTimezoneOffset() * 60 * 1000);
			var endTime = endDate.getTime() - (endDate.getTimezoneOffset() * 60 * 1000);

			if (dateTime >= startTime && dateTime <= endTime) {
				return reservarion.status;
			}
		}

		return 0;
	}

	static setReservationStatus(reservationId, status, successCallback, errorCallback) {
		new Request(FrouMonk.REQUEST_URI + "Api/Reservation", Request.POST, successCallback, errorCallback).send({
			reservation_id: reservationId,
			status: status,
			code: localStorage.getItem("code")
		});
	}

	static setReservationStatusLocally(reservationId, status) {
		for (var i = ReservationManager.reservations.length - 1; i >= 0; i--) {
			if (ReservationManager.reservations[i].reservation_id == reservationId) {
				ReservationManager.reservations[i].status = status;
				return;
			}
		}
	}

	static deleteReservation(reservationId, successCallback, errorCallback) {
		new Request(FrouMonk.REQUEST_URI + "Api/Reservation/Delete", Request.POST, successCallback, errorCallback).send({
			reservation_id: reservationId,
			code: localStorage.getItem("code")
		});
	}

	static deleteReservationLocally(reservationId) {
		for (var i = ReservationManager.reservations.length - 1; i >= 0; i--) {
			if (ReservationManager.reservations[i].reservation_id == reservationId) {
				ReservationManager.reservations.splice(i, 1);
				return;
			}
		}
	}
}