package cz.agents.agentpolis.darptestbed.simmodel.agent.data.generator.support;
import java.util.Set;
import org.joda.time.Duration;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.PassengerRequest;
import cz.agents.agentpolis.darptestbed.simmodel.agent.data.TimeWindow;
import cz.agents.agentpolis.siminfrastructure.time.TimeProvider;
public class RequestBuilder {
private final static long HOUR_24 = Duration.standardDays(1).getMillis();
private final long originMappedToNodeId;
private final long destinationMappedToNodeId;
private final PassengerRequest request;
private final long callTimeInDayRange;
private final TimeProvider timeProvider;
public RequestBuilder(long originMappedToNodeId, long destinationMappedToNodeId, PassengerRequest request,
long callTimeInDayRange, TimeProvider timeProvider) {
super();
this.originMappedToNodeId = originMappedToNodeId;
this.destinationMappedToNodeId = destinationMappedToNodeId;
this.request = request;
this.callTimeInDayRange = callTimeInDayRange;
this.timeProvider = timeProvider;
}
public cz.agents.agentpolis.darptestbed.simmodel.agent.data.Request buildRequest(String passengerId,
Set<String> additionalRequirements) {
long addSimulationTimeAlignedDayBeginning = computeSimulationTime();
long departFrom = request.fromTimeWindow.fromTimeInDayRange + addSimulationTimeAlignedDayBeginning;
long departTo = request.fromTimeWindow.toTimeInDayRange + addSimulationTimeAlignedDayBeginning;
long arriveFrom = request.toTimeWindow.fromTimeInDayRange + addSimulationTimeAlignedDayBeginning;
long arriveTo = request.toTimeWindow.toTimeInDayRange + addSimulationTimeAlignedDayBeginning;
TimeWindow timeWindow = new TimeWindow(departFrom, departTo, arriveFrom, arriveTo);
return new cz.agents.agentpolis.darptestbed.simmodel.agent.data.Request(passengerId, callTimeInDayRange,
originMappedToNodeId, destinationMappedToNodeId, timeWindow, additionalRequirements);
}
private long computeSimulationTime() {
long nextDayFlag = 0;
if (timeProvider.getSimTimeInDayRange() > getMinDepartureTimeInDayRange()) {
nextDayFlag++;
}
return (timeProvider.getCurrentDayFlag() + nextDayFlag) * HOUR_24;
}
private long getMinDepartureTimeInDayRange() {
return request.fromTimeWindow.fromTimeInDayRange;
}
}