package com.github.windbender.resources;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
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 javax.ws.rs.core.Response.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.windbender.auth.Priv;
import com.github.windbender.auth.SessionAuth;
import com.github.windbender.auth.SessionCurProj;
import com.github.windbender.auth.SessionUser;
import com.github.windbender.core.CurrentEventInfo;
import com.github.windbender.core.GoodParams;
import com.github.windbender.core.ImageRec;
import com.github.windbender.core.Limiter;
import com.github.windbender.core.LocationSpeciesCount;
import com.github.windbender.core.ReportParams;
import com.github.windbender.core.ReportResponse;
import com.github.windbender.core.ReviewParams;
import com.github.windbender.core.Series;
import com.github.windbender.core.SessionFilteredAuthorization;
import com.github.windbender.core.SpeciesCount;
import com.github.windbender.dao.EventDAO;
import com.github.windbender.dao.GoodDAO;
import com.github.windbender.dao.ImageRecordDAO;
import com.github.windbender.dao.ReportDAO;
import com.github.windbender.dao.ReviewDAO;
import com.github.windbender.dao.StringSeries;
import com.github.windbender.domain.Good;
import com.github.windbender.domain.ImageEvent;
import com.github.windbender.domain.ImageRecord;
import com.github.windbender.domain.Project;
import com.github.windbender.domain.Review;
import com.github.windbender.domain.User;
import com.yammer.dropwizard.hibernate.UnitOfWork;
import com.yammer.metrics.annotation.Timed;
@Path("/report")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ReportResource {
Logger log = LoggerFactory.getLogger(ReportResource.class);
ReportDAO rd;
private EventDAO eventDAO;
private ImageRecordDAO imageRecordDAO;
private ReviewDAO reviewDao;
private GoodDAO goodDao;
public ReportResource(ReportDAO rd,EventDAO eventDAO,ImageRecordDAO imageRecordDAO, ReviewDAO reviewDao, GoodDAO goodDao) {
this.rd = rd;
this.eventDAO = eventDAO;
this.imageRecordDAO = imageRecordDAO;
this.reviewDao = reviewDao;
this.goodDao = goodDao;
}
@GET
@Timed
@UnitOfWork
@Path("bestimages")
public List<ImageRecord> bestImages(@SessionAuth(required={Priv.REPORT}) SessionFilteredAuthorization auths,@SessionUser User user, @SessionCurProj Project currentProject) {
List<ImageRecord> l = imageRecordDAO.findBestByVote(currentProject.getId());
return l;
}
@POST
@Timed
@UnitOfWork
@Path("good")
public Response updateGood(@SessionAuth(required={Priv.REPORT}) SessionFilteredAuthorization auths,@SessionUser User user, @SessionCurProj Project currentProject, GoodParams goodParams) {
if(goodParams.getImageId() != null) {
ImageRecord ir = imageRecordDAO.findById(goodParams.getImageId());
Good g = new Good(ir,user,goodParams.getGood());
goodDao.saveOrUpdate(g);
}
return Response.ok().build();
}
@POST
@Timed
@UnitOfWork
@Path("review")
public Response updateReview(@SessionAuth(required={Priv.REPORT}) SessionFilteredAuthorization auths,@SessionUser User user, @SessionCurProj Project currentProject, ReviewParams reviewParams) {
long eventId = Long.parseLong(reviewParams.getEventId());
log.info("event "+eventId+" is "+reviewParams.getReview());
ImageEvent ie = eventDAO.findById(eventId);
Review r = new Review(ie,user,reviewParams.getReview()>0);
reviewDao.saveOrUpdate(r);
return Response.ok().build();
}
@GET
@Timed
@UnitOfWork
@Path("event/{eventId}")
public Response getEventData(@SessionAuth(required={Priv.REPORT}) SessionFilteredAuthorization auths,@SessionUser User user, @SessionCurProj Project currentProject, @PathParam("eventId") Long eventId) {
if(eventId == null) return Response.status(Status.NOT_FOUND).build();
ImageEvent e = eventDAO.findById(eventId);
if(e == null) return Response.status(Status.NOT_FOUND).build();
// load data about categorization
List<SpeciesCount> lsc = this.rd.findCategorizationData(e);
// load flagging data
Integer reviewCount = this.reviewDao.getReviewFlagCount(e,user);
Map<String, Integer> m = new HashMap<String,Integer>();
// load images data included "good" images data
for(ImageRecord ir :e.getImageRecords()) {
Integer good = this.goodDao.getGoodFlagCount(ir,user);
m.put(ir.getId(),good);
}
CurrentEventInfo cei = new CurrentEventInfo(lsc,reviewCount,m);
return Response.ok(cei).build();
}
@POST
@Timed
@UnitOfWork
public ReportResponse makeReport(@SessionAuth(required={Priv.REPORT}) SessionFilteredAuthorization auths,@SessionUser User user, @SessionCurProj Project currentProject, ReportParams reportParams) {
log.info("making a report for "+user.getUsername()+" on project "+currentProject.getName()+" with params "+reportParams+" and auth TBD");
Limiter limits = new Limiter(reportParams,currentProject);
List<StringSeries> bySpecies = rd.makeBySpecies(limits);
List<Series> byHour = rd.makeByHour(limits);
List<Series> byDay = rd.makeByDay(limits);
List<Series> byMonth = rd.makeByMonth(limits);
//List<Long> l = rd.makeImageEvents(limits);
List<LocationSpeciesCount> lsc = rd.makeLocations(limits);
List<ImageRec> lout = rd.makeImageRecs(limits);
// List<ImageRec> lout = new ArrayList<ImageRec>();
// for(Long lng: l) {
// ImageEvent ie = eventDAO.findById(lng);
// for(ImageRecord ir : ie.getImageRecords()) {
// ir.getId();
// }
// ImageRec irec = new ImageRec(ie);
// lout.add(irec);
// }
ReportResponse rr = new ReportResponse();
rr.setBySpeciesData(bySpecies);
rr.setByHourData(byHour);
rr.setByDayData(byDay);
rr.setByMonthData(byMonth);
rr.setImageEvents(lout);
rr.setLocationSpeciesCount(lsc);
rr.setMapCenter(currentProject.getCenterLat(),currentProject.getCenterLon());
return rr;
}
}