package de.rwth.idsg.bikeman.ixsi.processor.query.user;
import com.google.common.base.Optional;
import de.rwth.idsg.bikeman.domain.Booking;
import de.rwth.idsg.bikeman.ixsi.ErrorFactory;
import de.rwth.idsg.bikeman.ixsi.IxsiProcessingException;
import de.rwth.idsg.bikeman.ixsi.processor.api.UserRequestProcessor;
import de.rwth.idsg.bikeman.ixsi.service.AvailabilityPushService;
import de.rwth.idsg.bikeman.ixsi.service.BookingCheckService;
import de.rwth.idsg.bikeman.ixsi.service.BookingService;
import de.rwth.idsg.bikeman.web.rest.exception.DatabaseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import xjc.schema.ixsi.BookingType;
import xjc.schema.ixsi.ChangeBookingRequestType;
import xjc.schema.ixsi.ChangeBookingResponseType;
import xjc.schema.ixsi.ErrorType;
import xjc.schema.ixsi.Language;
import xjc.schema.ixsi.TimePeriodType;
import xjc.schema.ixsi.UserInfoType;
/**
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
* @since 26.09.2014
*/
@Component
public class ChangeBookingRequestProcessor implements
UserRequestProcessor<ChangeBookingRequestType, ChangeBookingResponseType> {
@Autowired private BookingService bookingService;
@Autowired private AvailabilityPushService availabilityPushService;
@Autowired private BookingCheckService bookingCheckService;
@Override
public Class<ChangeBookingRequestType> getProcessingClass() {
return ChangeBookingRequestType.class;
}
@Override
public ChangeBookingResponseType processAnonymously(ChangeBookingRequestType request, Optional<Language> lan) {
return buildError(ErrorFactory.Auth.notAnonym("Anonymous change booking request not allowed", null));
}
@Override
public ChangeBookingResponseType processForUser(ChangeBookingRequestType request, Optional<Language> lan,
UserInfoType userInfo) {
try {
if (request.isSetCancel() && request.isCancel()) {
return proceedCancel(request, userInfo);
} else {
return proceedChange(request, userInfo);
}
} catch (DatabaseException e) {
return buildError(ErrorFactory.Booking.idUnknown(e.getMessage(), null));
} catch (IxsiProcessingException e) {
return buildError(ErrorFactory.Booking.changeNotPossible(e.getMessage(), e.getMessage()));
}
}
private ChangeBookingResponseType proceedChange(ChangeBookingRequestType request, UserInfoType userInfo) {
Booking oldBooking = bookingService.get(request.getBookingID(), userInfo.getUserID());
TimePeriodType oldTimePeriod = buildTimePeriod(oldBooking);
Booking newBooking = bookingService.update(oldBooking, request.getNewTimePeriodProposal());
TimePeriodType newTimePeriod = buildTimePeriod(newBooking);
BookingType responseBooking = new BookingType()
.withID(newBooking.getIxsiBookingId())
.withTimePeriod(newTimePeriod);
String pedelecId = newBooking.getReservation()
.getPedelec()
.getManufacturerId();
String placeId = newBooking.getReservation()
.getPedelec()
.getStationSlot()
.getStation()
.getManufacturerId();
availabilityPushService.changedBooking(pedelecId, placeId, oldTimePeriod, newTimePeriod);
bookingCheckService.changedBooking(oldBooking, newBooking);
return new ChangeBookingResponseType().withBooking(responseBooking);
}
private ChangeBookingResponseType proceedCancel(ChangeBookingRequestType request, UserInfoType userInfo) {
Booking booking = bookingService.cancel(request.getBookingID(), userInfo.getUserID());
TimePeriodType timePeriod = buildTimePeriod(booking);
String pedelecId = booking.getReservation()
.getPedelec()
.getManufacturerId();
String placeId = booking.getReservation()
.getPedelec()
.getStationSlot()
.getStation()
.getManufacturerId();
availabilityPushService.cancelledBooking(pedelecId, placeId, timePeriod);
bookingCheckService.cancelledBooking(booking);
return new ChangeBookingResponseType();
}
private TimePeriodType buildTimePeriod(Booking booking) {
return new TimePeriodType()
.withBegin(booking.getReservation().getStartDateTime().toDateTime())
.withEnd(booking.getReservation().getEndDateTime().toDateTime());
}
// -------------------------------------------------------------------------
// Error handling
// -------------------------------------------------------------------------
@Override
public ChangeBookingResponseType buildError(ErrorType e) {
return new ChangeBookingResponseType().withError(e);
}
}