#include <config.h>
#include "AGWorkPosition.h"
#include "AGStreet.h"
#include "AGPosition.h"
#include "AGDataAndStatistics.h"
#include "AGAdult.h"
#include <utils/common/RandHelper.h>
#include <iostream>
AGWorkPosition::AGWorkPosition(AGDataAndStatistics* ds, const AGStreet& inStreet) :
myStatData(ds),
myLocation(inStreet),
myAdult(nullptr),
myOpeningTime(generateOpeningTime(*ds)),
myClosingTime(generateClosingTime(*ds)) {
ds->workPositions++;
}
AGWorkPosition::AGWorkPosition(AGDataAndStatistics* ds, const AGStreet& inStreet, double pos) :
myStatData(ds),
myLocation(inStreet, pos),
myAdult(nullptr),
myOpeningTime(generateOpeningTime(*ds)),
myClosingTime(generateClosingTime(*ds)) {
ds->workPositions++;
}
AGWorkPosition::~AGWorkPosition() {
}
void
AGWorkPosition::print() const {
std::cout << "- AGWorkPosition: open=" << myOpeningTime << " closingTime=" << myClosingTime << " taken=" << isTaken() << std::endl;
std::cout << "\t";
myLocation.print();
}
int
AGWorkPosition::generateOpeningTime(const AGDataAndStatistics& ds) {
double choice = RandHelper::rand();
double cumul = 0;
for (std::map<int, double>::const_iterator it = ds.beginWorkHours.begin();
it != ds.beginWorkHours.end(); ++it) {
cumul += it->second;
if (cumul >= choice) {
return it->first;
}
}
std::cout << "-- WARNING: work time distribution not complete (Sum(proportions) != 1): AUTODEFINED at 9.00am --" << std::endl;
return 32400;
}
int
AGWorkPosition::generateClosingTime(const AGDataAndStatistics& ds) {
double choice = RandHelper::rand();
double cumul = 0;
for (std::map<int, double>::const_iterator it = ds.endWorkHours.begin();
it != ds.endWorkHours.end(); ++it) {
cumul += it->second;
if (cumul >= choice) {
return it->first;
}
}
std::cout << "-- WARNING: work time distribution not complete (Sum(proportions) != 1): AUTODEFINED at 5.00pm --" << std::endl;
return 61200;
}
bool
AGWorkPosition::isTaken() const {
return (myAdult != nullptr);
}
void
AGWorkPosition::let() {
if (myAdult != nullptr) {
myStatData->workPositions++;
myAdult->lostWorkPosition();
myAdult = nullptr;
}
}
void
AGWorkPosition::take(AGAdult* worker) {
if (myAdult == nullptr) {
myStatData->workPositions--;
myAdult = worker;
} else {
throw ProcessError(TL("Work position already occupied. Cannot give it to another adult."));
}
}
AGPosition
AGWorkPosition::getPosition() const {
return myLocation;
}
int
AGWorkPosition::getClosing() const {
return myClosingTime;
}
int
AGWorkPosition::getOpening() const {
return myOpeningTime;
}