import helpers.RandomNumberGenerator;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.Queue;
public class AgentsQueue {
private int arrivalRate;
private int timeToNextEvent;
private int maxLength;
private int allTimeLength;
private Queue agents;
private int resignedAgents;
private AgentsQueue() {
this.maxLength = -1;
this.allTimeLength = 0;
this.agents = new ArrayDeque<>();
this.resignedAgents = 0;
}
public AgentsQueue(int arrivalRate) {
this();
this.arrivalRate = arrivalRate;
}
public AgentsQueue(int arrivalRate, int maxLength) {
this();
this.arrivalRate = arrivalRate;
this.maxLength = maxLength;
}
public int getAllTimeLength() {
return allTimeLength;
}
public int getResignedAgents() {
return resignedAgents;
}
public Queue getAgents() {
return agents;
}
public void handleAgents() {
Iterator iter = this.agents.iterator();
while (iter.hasNext()) {
Agent agent = iter.next();
agent.waitInLine();
if (agent.getCurrWaitTime() > agent.getMaxWaitTime()) {
iter.remove();
this.resignedAgents++;
}
}
}
public void scheduleNextEvent() {
RandomNumberGenerator randomNumberGenerator = new RandomNumberGenerator();
this.timeToNextEvent = randomNumberGenerator.gerRandomNumberBasedOnAverage(this.arrivalRate);
// System.out.println("new event in: " + this.timeToNextEvent);
}
public void handleEvents() {
this.timeToNextEvent--;
if (this.timeToNextEvent == 0) {
this.scheduleNextEvent();
if (this.hasFreeSpace()) {
Agent agent = new Agent();
this.addAgent(agent);
}
}
}
private void addAgent(Agent agent) throws UnsupportedOperationException {
if (this.agents.size() < this.maxLength || this.maxLength == -1) {
this.agents.add(agent);
} else {
throw new UnsupportedOperationException();
}
}
public Agent removeAgent() {
this.allTimeLength++;
return this.agents.poll();
}
private void resignAgent(Agent agent) {
this.agents.remove(agent);
// System.out.println("resigned");
this.resignedAgents++;
}
public boolean hasFreeSpace() {
return this.maxLength == -1 || this.maxLength > this.agents.size();
}
public boolean isEmpty() {
return this.agents.size() == 0;
}
@Override
public String toString() {
return "AgentsQueue{" +
"arrivalRate=" + arrivalRate +
", maxLength=" + maxLength +
", allTimeLength=" + allTimeLength +
", agents=" + agents +
'}';
}
}