package com.sap.pto.services;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.joda.time.DateTime;
import com.sap.pto.dao.FixtureDAO;
import com.sap.pto.dao.PredictionDAO;
import com.sap.pto.dao.UserDAO;
import com.sap.pto.dao.entities.Fixture;
import com.sap.pto.dao.entities.Prediction;
import com.sap.pto.dao.entities.User;
import com.sap.pto.dao.entities.UserStatistics;
@Path("/predictionservice")
public class PredictionService extends BasicService {
@POST
@Path("/predictions")
@Consumes(MediaType.APPLICATION_JSON)
public Response createPrediction(Prediction prediction) {
User user = userUtil.getLoggedInUser(request);
prediction.setUser(user);
if (prediction.getResult() == null) {
throwBadRequest("There was no result supplied.");
}
// check if deadline is over
Fixture fixture = new FixtureDAO().getById(prediction.getFixture().getId());
if (fixture == null) {
throwNotFound("Fixture could not be found.");
}
if (new DateTime(fixture.getMatchDate()).isBefore(DateTime.now())) {
throwBadRequest("Predictions can only be entered until the match started.");
}
// check if a prediction already exists
List<Prediction> predictions = PredictionDAO.getForUser(user);
for (Prediction oldPrediction : predictions) {
if (oldPrediction.getFixture().getId() == prediction.getFixture().getId()) {
throwBadRequest("A prediction for this fixture exists already.");
}
}
PredictionDAO.saveNew(prediction);
return Response.ok(prediction).build();
}
@PUT
@Path("/predictions")
@Consumes(MediaType.APPLICATION_JSON)
public Response updatePrediction(Prediction prediction) {
User user = userUtil.getLoggedInUser(request);
prediction.setUser(user);
// find prediction
List<Prediction> predictions = PredictionDAO.getForUser(user);
for (Prediction oldPrediction : predictions) {
if (oldPrediction.getFixture().getId() == prediction.getFixture().getId()) {
oldPrediction.setResult(prediction.getResult());
oldPrediction = PredictionDAO.save(oldPrediction);
return Response.ok(oldPrediction).build();
}
}
throwNotFound("No matching existing prediction was found.");
return RESPONSE_BAD;
}
@GET
@Path("/predictions")
@Produces(MediaType.APPLICATION_JSON)
public List<Prediction> getUserPredictions() {
User user = userUtil.getLoggedInUser(request);
List<Prediction> predictions = PredictionDAO.getForUser(user);
return predictions;
}
@GET
@Path("/predictions/{fixtureId}")
@Produces(MediaType.APPLICATION_JSON)
public Prediction getUserPredictionForFixture(@PathParam("fixtureId") long fixtureId) {
User user = this.userUtil.getLoggedInUser(request);
Fixture fixture = new FixtureDAO().getById(fixtureId);
Prediction prediction = PredictionDAO.getForUserAndFixture(user, fixture);
return prediction;
}
@GET
@Path("/pastpredictions/{id}")
@Produces(MediaType.APPLICATION_JSON)
public List<Prediction> getUserPastPredictions(@PathParam("id") long userId) {
User user = new UserDAO().getById(userId);
if (user == null) {
throwBadRequest("The supplied user id is invalid.");
}
List<Prediction> predictions = PredictionDAO.getPastForUser(user);
return predictions;
}
@GET
@Path("/statistics/{id}")
@Produces(MediaType.APPLICATION_JSON)
public UserStatistics getUserStatistics(@PathParam("id") long userId) {
User user = new UserDAO().getById(userId);
if (user == null) {
throwBadRequest("The supplied user id is invalid.");
}
UserStatistics stats = new UserStatistics(user);
return stats;
}
}