package com.javarush.task.task27.task2712.statistic;
import com.javarush.task.task27.task2712.kitchen.Cook;
import com.javarush.task.task27.task2712.statistic.event.CookedOrderEventDataRow;
import com.javarush.task.task27.task2712.statistic.event.EventDataRow;
import com.javarush.task.task27.task2712.statistic.event.EventType;
import com.javarush.task.task27.task2712.statistic.event.VideoSelectedEventDataRow;
import java.text.SimpleDateFormat;
import java.util.*;
public class StatisticManager {
private static StatisticManager instance;
private StatisticStorage statisticStorage = new StatisticStorage();
private Set<Cook> cooks = new HashSet<>();
public static StatisticManager getInstance() {
if (instance == null) {
instance = new StatisticManager();
}
return instance;
}
private StatisticManager() {
}
public void register(EventDataRow data) {
statisticStorage.put(data);
}
public void register(Cook cook) {
cooks.add(cook);
}
public Map<String, Double> allAmountPerDay() {
List<EventDataRow> videoList = new ArrayList<>();
Map<String, Double> result = new TreeMap<>(Collections.reverseOrder());
Map<EventType, List<EventDataRow>> map = statisticStorage.getStorage();
for (Map.Entry<EventType, List<EventDataRow>> entry : map.entrySet()) {
if (entry.getKey() == EventType.SELECTED_VIDEOS) {
videoList.addAll(entry.getValue());
}
}
for (EventDataRow e : videoList) {
VideoSelectedEventDataRow videoSelectedEventDataRow = (VideoSelectedEventDataRow) e;
double amount = videoSelectedEventDataRow.getAmount()/100;
Date date = videoSelectedEventDataRow.getDate();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
if (!result.containsKey(dateFormat.format(date))) {
result.put(dateFormat.format(date), amount);
} else {
amount += videoSelectedEventDataRow.getAmount()/100;
result.put(dateFormat.format(date), amount);
}
}
return result;
}
public Map<String, Map<String, Integer>> allTimeCooking() {
List<EventDataRow> cookList = new ArrayList<>();
Map<String, Map<String, Integer>> cookTime = new TreeMap<>(Collections.reverseOrder());
Map<EventType, List<EventDataRow>> map = statisticStorage.getStorage();
for (Map.Entry<EventType, List<EventDataRow>> entry : map.entrySet()) {
if (entry.getKey() == EventType.COOKED_ORDER) {
cookList.addAll(entry.getValue());
}
}
for (EventDataRow e : cookList) {
CookedOrderEventDataRow cookedOrderEventDataRow = (CookedOrderEventDataRow) e;
int allTime = 0;
Date date = cookedOrderEventDataRow.getDate();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
Map<String, Integer> nameMap = new TreeMap<>();
for (EventDataRow e1 : cookList) {
CookedOrderEventDataRow cookedOrderEventDataRow1 = (CookedOrderEventDataRow) e1;
if (dateFormat.format(cookedOrderEventDataRow1.getDate()).equals(dateFormat.format(date))) {
if (!nameMap.containsKey(cookedOrderEventDataRow1.getCookName())) {
allTime = cookedOrderEventDataRow1.getTime();
nameMap.put(cookedOrderEventDataRow1.getCookName(), allTime);
} else {
allTime += cookedOrderEventDataRow1.getTime();
nameMap.put(cookedOrderEventDataRow1.getCookName(), allTime);
}
}
}
cookTime.put(dateFormat.format(date), nameMap);
}
return cookTime;
}
private class StatisticStorage {
private Map<EventType, List<EventDataRow>> storage = new HashMap<>();
private StatisticStorage() {
for (EventType e : EventType.values()) {
storage.put(e, new ArrayList<EventDataRow>());
}
}
public Map<EventType, List<EventDataRow>> getStorage() {
return storage;
}
private void put(EventDataRow data) {
storage.get(data.getType()).add(data);
}
}
}
package com.javarush.task.task27.task2712;
import com.javarush.task.task27.task2712.ad.AdvertisementManager;
import com.javarush.task.task27.task2712.ad.NoVideoAvailableException;
import com.javarush.task.task27.task2712.kitchen.Order;
import com.javarush.task.task27.task2712.statistic.StatisticManager;
import com.javarush.task.task27.task2712.statistic.event.NoAvailableVideoEventDataRow;
import java.io.IOException;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Tablet extends Observable {
private final int number;
private static Logger logger = Logger.getLogger(Tablet.class.getName());
public Tablet(int number) {
this.number = number;
}
public Order createOrder() {
Order order = null;
try {
order = new Order(this);
} catch (IOException e) {
logger.log(Level.SEVERE, "Console is unavailable.");
} finally {
if (!order.isEmpty()) {
setChanged();
notifyObservers(order);
}
AdvertisementManager advertisementManager = new AdvertisementManager(order.getTotalCookingTime() * 60);
try {
advertisementManager.processVideos();
} catch (NoVideoAvailableException e) {
StatisticManager.getInstance().register(new NoAvailableVideoEventDataRow(order.getTotalCookingTime() * 60));
logger.log(Level.INFO, "No video is available for the order " + order);
}
}
return order;
}
@Override
public String toString() {
return "Tablet{" + "number=" + number + "}";
}
}