package org.fluxtream.core.connectors.bodytrackResponders;
import java.util.ArrayList;
import java.util.List;
import org.fluxtream.core.TimeInterval;
import org.fluxtream.core.connectors.ObjectType;
import org.fluxtream.core.connectors.vos.AbstractFacetVO;
import org.fluxtream.core.domain.AbstractFacet;
import org.fluxtream.core.domain.ApiKey;
import org.fluxtream.core.domain.ApiKeyAttribute;
import org.fluxtream.core.domain.ChannelMapping;
import org.fluxtream.core.domain.GuestSettings;
import org.fluxtream.core.mvc.models.TimespanModel;
import org.fluxtream.core.services.ApiDataService;
import org.fluxtream.core.services.GuestService;
import org.fluxtream.core.services.MetadataService;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public abstract class AbstractBodytrackResponder {
@Autowired
protected MetadataService metadataService;
@Autowired
protected ApiDataService apiDataService;
@Autowired
protected GuestService guestService;
protected List<AbstractFacet> getFacetsInTimespan(TimeInterval timeInterval, ApiKey apiKey, ObjectType objectType){
//TODO: determine whether or not date based queries are necessary
//if (objectType!=null&&objectType.isDateBased()){
// List<String> dates = new ArrayList<String>();
// org.joda.time.DateTime start = new org.joda.time.DateTime(timeInterval.getStart());
// org.joda.time.DateTime end = new org.joda.time.DateTime(timeInterval.getEnd());
// while (start.isBefore(end)){
// dates.add(dateFormatter.print(start));
// start = start.plusDays(1);
// }
// String endDate = dateFormatter.print(end);
// if (!dates.contains(endDate)) dates.add(endDate);
//
// return apiDataService.getApiDataFacets(apiKey,objectType,dates);
//
//}
//else {
return apiDataService.getApiDataFacets(apiKey,objectType,timeInterval, null);
//}
}
protected List<AbstractFacet> getFacetsInTimespanOrderedByEnd(TimeInterval timeInterval, ApiKey apiKey, ObjectType objectType){
return apiDataService.getApiDataFacets(apiKey,objectType,timeInterval,null,"facet.end ASC", null);
}
protected List<AbstractFacetVO<AbstractFacet>> getFacetVOsForFacets(List<AbstractFacet> facets,TimeInterval timeInterval, GuestSettings guestSettings){
List<AbstractFacetVO<AbstractFacet>> facetVOs = new ArrayList<AbstractFacetVO<AbstractFacet>>();
for (AbstractFacet facet : facets){
try{
AbstractFacetVO<AbstractFacet> facetVO = AbstractFacetVO.getFacetVOClass(facet).newInstance();
facetVO.extractValues(facet,timeInterval,guestSettings);
facetVOs.add(facetVO);
}
catch (Exception e){
e.printStackTrace();
}
}
return facetVOs;
}
public abstract List<TimespanModel> getTimespans(long startMillis, long endMillis, ApiKey apiKey, String channelName);
public abstract List<AbstractFacetVO<AbstractFacet>> getFacetVOs(GuestSettings guestSettings, ApiKey apiKey, String objectTypeName,long start,long end,String value);
//note: assumption made: list will be sorted such that the last element in it will have the highest end time and newModel is the closest new model to that one
public void simpleMergeAddTimespan(List<TimespanModel> list, TimespanModel newModel, long startMillis, long endMillis){
final int largeWidth = 1920;
final double millisPerPixel = (endMillis - startMillis) / (double) largeWidth;
if (!list.isEmpty()){
TimespanModel lastModel = list.get(list.size() - 1);
if (lastModel.getObjectType().equals(newModel.getObjectType()) && lastModel.getValue().equals(newModel.getValue())){
double millisFromEndToEnd = (newModel.getEnd() - lastModel.getEnd()) * 1000;
double pixelDifference = millisFromEndToEnd / millisPerPixel;
if (pixelDifference < 5){
lastModel.setEnd(newModel.getEnd());
return;
}
}
}
list.add(newModel);
}
public abstract void addToDeclaredChannelMappings(ApiKey apiKey, List<ChannelMapping> mappings);
}