package quba.service;
import com.avaje.ebean.Query;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import quba.models.QubaStation;
import quba.models.QubaSubjective;
import service.PoseidonPropertyService;
import service.PoseidonService;
import java.util.ArrayList;
import java.util.List;
public class QubaWindWarningFetcher {
private final static Logger logger = LoggerFactory.getLogger(QubaWindWarningFetcher.class);
public boolean fetchWarning(String position_name, DateTime date, Integer termin) {
logger.info("fetchWarning: posisjon {}, dato {} og termin {}", position_name,date,termin);
List<QubaSubjective> windValues = getWindValues(position_name, date, termin);
DateTime startOfWindow = date.withTimeAtStartOfDay().plusHours(termin);
int windowsize = PoseidonPropertyService.getIntProperty("quba.strongwind.windowsize");
DateTime endOfWindow = startOfWindow.plusHours(windowsize);
return hasStrongWinds(windValues,endOfWindow);
}
public List<QubaSubjective> getWindValues(String position_name,DateTime date, Integer termin){
List<QubaSubjective> result = new ArrayList<>();
QubaStation station = QubaStation.findStationByName(position_name);
if ( station == null) {
logger.warn("Fant ikke stasjon med navn {}",position_name);
return result;
}
int windowsize = PoseidonPropertyService.getIntProperty("quba.strongwind.windowsize");
int pindexid = PoseidonPropertyService.getIntProperty("quba.strongwind.pindexid");
int levelid = PoseidonPropertyService.getIntProperty("quba.strongwind.levelid");
DateTime run = date.withTimeAtStartOfDay().plusHours(termin);
DateTime limit = run.plusHours(windowsize);
Query<QubaSubjective> qubaSubjectiveQuery = QubaSubjective.find.where()
.eq("pindexid", pindexid)
.eq("levelid", levelid)
.eq("stationid", station.stationid)
.eq("run", run.toDate())
.le("valid", limit.toDate())
.orderBy("value desc");
List<QubaSubjective> subjectives = qubaSubjectiveQuery.findList();
logger.debug("Kjørte sql {}, pindexid={}, stationid={}, levelid={},run={}, valid={}",
qubaSubjectiveQuery.getGeneratedSql(),
pindexid,station.stationid,levelid,run,limit);
logger.debug("Fant {} subjectives",subjectives.size());
return subjectives;
}
boolean hasStrongWinds(List<QubaSubjective> subjectives, DateTime endOfWindow){
boolean hasStrongWinds = false;
double windLimit = PoseidonPropertyService.getFloatProperty("quba.strongwind.limit");
for (QubaSubjective subjective : subjectives) {
DateTime runDate = new DateTime(subjective.pk.runDate, PoseidonService.getTimeZone());
logger.debug("runDate = {}, endOfWindow={},value={}",runDate,endOfWindow,subjective.value);
if ( runDate.isBefore(endOfWindow) && subjective.value > windLimit) {
hasStrongWinds = true;
break;
}
}
logger.debug("hasStrongWinds={}",hasStrongWinds);
return hasStrongWinds;
}
}