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); } } }