package com.sap.pto.paul;
import java.util.List;
import java.util.Random;
import com.sap.pto.dao.PredictionDAO;
import com.sap.pto.dao.entities.Fixture;
import com.sap.pto.dao.entities.Fixture.Result;
import com.sap.pto.dao.entities.Prediction;
import com.sap.pto.dao.entities.User;
import com.sap.pto.util.UserUtil;
/**
* Implements the logic for Paul's betting behavior based on a crowd-sourced approach,
* taking into account all predictions and betting on the average.
*
*/
public class AveragePaul {
/**
* High-Speed version for synchronous calls which only adds missing predictions.
*/
public synchronized static void predictMissingFixtures(List<Fixture> fixtures, List<Prediction> predictions) {
User paul = UserUtil.getPaul();
for (Fixture fixture : fixtures) {
boolean found = false;
for (Prediction prediction : predictions) {
if (prediction.getUser().equals(paul) && prediction.getFixture().getId() == fixture.getId()) {
found = true;
break;
}
}
if (!found) {
Prediction prediction = new Prediction(paul, fixture, getPaulPrediction(fixture));
PredictionDAO.saveNew(prediction);
predictions.add(prediction);
}
}
}
public synchronized static void predictFixtures(List<Fixture> fixtures) {
User paul = UserUtil.getPaul();
for (Fixture fixture : fixtures) {
Prediction prediction = PredictionDAO.getForUserAndFixture(paul, fixture);
if (prediction == null) {
prediction = new Prediction(paul, fixture, getPaulPrediction(fixture));
PredictionDAO.saveNew(prediction);
} else {
prediction.setResult(getPaulPrediction(fixture));
PredictionDAO.save(prediction);
}
}
}
public static Result getPaulPrediction(Fixture fixture) {
long[] count = new long[Result.values().length];
List<Prediction> predictions = PredictionDAO.getForFixture(fixture);
for (Prediction prediction : predictions) {
count[prediction.getResult().ordinal()] += 1;
}
int predictionPos = new Random().nextInt(count.length - 1) + 1; // start off with a random prediction
for (int i = 0; i < count.length; i++) {
if (count[i] > count[predictionPos]) {
predictionPos = i;
}
}
return Result.values()[predictionPos];
}
}