package de.rwth.idsg.bikeman.ixsi.processor.query.user;
import com.google.common.base.Optional;
import de.rwth.idsg.bikeman.ixsi.ErrorFactory;
import de.rwth.idsg.bikeman.ixsi.IXSIConstants;
import de.rwth.idsg.bikeman.ixsi.dto.PlaceAvailabilityResponseDTO;
import de.rwth.idsg.bikeman.ixsi.processor.api.UserRequestProcessor;
import de.rwth.idsg.bikeman.ixsi.repository.QueryIXSIRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import xjc.schema.ixsi.ErrorType;
import xjc.schema.ixsi.Language;
import xjc.schema.ixsi.PlaceAvailabilityRequestType;
import xjc.schema.ixsi.PlaceAvailabilityResponseType;
import xjc.schema.ixsi.PlaceAvailabilityType;
import xjc.schema.ixsi.ProviderPlaceIDType;
import xjc.schema.ixsi.UserInfoType;
import java.util.ArrayList;
import java.util.List;
/**
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
* @since 26.09.2014
*/
@Component
public class PlaceAvailabilityRequestProcessor implements
UserRequestProcessor<PlaceAvailabilityRequestType, PlaceAvailabilityResponseType> {
@Autowired private QueryIXSIRepository queryIXSIRepository;
@Override
public Class<PlaceAvailabilityRequestType> getProcessingClass() {
return PlaceAvailabilityRequestType.class;
}
@Override
public PlaceAvailabilityResponseType processAnonymously(PlaceAvailabilityRequestType request, Optional<Language> lan) {
List<PlaceAvailabilityResponseDTO> dtos = new ArrayList<>();
if (request.isSetPlaceID()) {
List<String> idList = new ArrayList<>();
for (ProviderPlaceIDType id : request.getPlaceID()) {
idList.add(id.getPlaceID());
}
dtos = queryIXSIRepository.placeAvailability(idList);
} else if (request.isSetGeoRectangle()) {
dtos = queryIXSIRepository.placeAvailability(request.getGeoRectangle());
} else if (request.isSetCircle()) {
dtos = queryIXSIRepository.placeAvailability(request.getCircle());
}
return new PlaceAvailabilityResponseType().withPlace(getPlaceAvailabilities(dtos));
}
@Override
public PlaceAvailabilityResponseType processForUser(PlaceAvailabilityRequestType request, Optional<Language> lan,
UserInfoType userInfo) {
// TODO
return buildError(ErrorFactory.Sys.notImplemented(null, null));
}
public List<PlaceAvailabilityType> getPlaceAvailabilities(List<PlaceAvailabilityResponseDTO> dtoList) {
List<PlaceAvailabilityType> placeAvailList = new ArrayList<>();
for (PlaceAvailabilityResponseDTO dto : dtoList) {
ProviderPlaceIDType providerPlaceIDType = new ProviderPlaceIDType()
.withPlaceID(dto.getManufacturerId())
.withProviderID(IXSIConstants.Provider.id);
placeAvailList.add(new PlaceAvailabilityType()
.withID(providerPlaceIDType)
.withAvailability(dto.getAvailableSlots()));
}
return placeAvailList;
}
// -------------------------------------------------------------------------
// Error handling
// -------------------------------------------------------------------------
@Override
public PlaceAvailabilityResponseType buildError(ErrorType e) {
return new PlaceAvailabilityResponseType().withError(e);
}
}