package quba.service;
import models.CleanableOrderModel;
import models.OrderModel;
import models.PositionModel;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.OrderService;
import service.PoseidonService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class QubaService extends PoseidonService {
private final OrderService orderService = new OrderService("akka");
private final static Logger logger = LoggerFactory.getLogger(QubaService.class);
public QubaService(String user) {
super(user);
}
public QubaSyncSummary copyPositions() {
logger.info("Starter QubaService.copyPositions");
QubaSyncSummary result = new QubaSyncSummary();
DateTime now = getNow();
List<OrderModel> orders = orderService.getActiveOrdersTomorrowForQba(now);
Map<PositionModel, Set<Integer>> positionTerminMap = new HashMap<>();
if (orders != null && orders.size() > 0) {
result.activeOrders = orders.size();
result.orders = orders;
logger.info("Fant {} aktive ordre", result.activeOrders);
DateTime tomorrow = now.plusDays(1);
for (OrderModel o : orders) {
Set<Integer> termins = o.getActiveTerminsForDayContainingTimestamp(tomorrow);
logger.info("Order {} har følgende aktive terminer: {} ", o.id, termins);
if (!positionTerminMap.containsKey(o.position)) {
positionTerminMap.put(o.position, termins);
} else {
Set<Integer> positiontermins = positionTerminMap.get(o.position);
positiontermins.addAll(termins);
positionTerminMap.put(o.position, positiontermins);
}
}
syncPositions(positionTerminMap, result);
result.positions = positionTerminMap.keySet();
result.positionsSynced = positionTerminMap.keySet().size();
} else {
logger.info("Fant ingen aktive ordre");
}
logger.info("QubaService.copyPositions ferdig");
return result;
}
private void syncPositions(Map<PositionModel, Set<Integer>> positionTermins, QubaSyncSummary result) {
logger.info("Synker {} posisjoner", positionTermins.keySet().size());
QubaPositionSyncer syncer = new QubaPositionSyncer(result);
for (PositionModel p : positionTermins.keySet()) {
Set<Integer> termins = positionTermins.get(p);
syncer.syncPosition(p, termins);
}
}
public int cleanupPositions() {
logger.info("Starter QubaService.cleanupPositions");
int result = 0;
DateTime now = new DateTime(PoseidonService.getTimeZone()).withTimeAtStartOfDay();
List<CleanableOrderModel> orders = orderService.getCleanableQubaOrders(now);
if (orders != null && orders.size() > 0) {
QubaPositionCleaner cleaner = new QubaPositionCleaner();
logger.info("Sjekker om {} ordre skal fjernes fra Quba", orders.size());
for (CleanableOrderModel order : orders) {
cleaner.cleanPosition(order, now);
}
result = orders.size();
}
logger.info("QubaService.cleanupPositions ferdig");
return result;
}
public static boolean qubaHasDataForPositionAndTermin(String name, DateTime dateOfProduction, Integer termin) {
QubaSubjectiveFetcher fetcher = new QubaSubjectiveFetcher();
return fetcher.fetchSubjective(name, dateOfProduction, termin);
}
public static boolean fetchStrongWindWarning(String position_name, DateTime date, Integer termin) {
return new QubaWindWarningFetcher().fetchWarning(position_name, date, termin);
}
public String terminsList(Set<Integer>termins){
if ( termins == null || termins.size() == 0) return "";
StringBuffer sb = new StringBuffer();
for (Integer termin : termins) {
if ( termin != null) {
sb.append(termin).append(",");
}
}
String list = sb.toString();
if ( list != null && !list.isEmpty()) {
return list.substring(0, list.length() - 1); // remove last comma
} else return "";
}
}