package catering.order; import org.springframework.data.util.Streamable; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.Optional; @Controller public class OrderController { private final CustomOrderRepository orderRepository; private final CustomCart cart; public OrderController(CustomOrderRepository orderRepository, CustomCart cart) { this.orderRepository = orderRepository; this.cart = cart; } @GetMapping("/orders") public String orders(Model model) { model.addAttribute("orders", orderRepository.getOrders()); model.addAttribute("total", orderRepository.getOrders().size()); return "orders"; } // For Theo: filters orders by day @GetMapping("/orders/{day}") public String orders(@PathVariable String day, Model model) { // Obtains an instance of LocalDate from a text string such as 2007-12-03. (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html) LocalDate date = LocalDate.parse(day); Collection myOrders = orderRepository.getOrdersByDate(date); model.addAttribute("orders", myOrders); model.addAttribute("total", myOrders.size()); return "orders"; } @GetMapping("/event") public String event(Model model) { model.addAttribute("orderType", cart.getOrderType()); model.addAttribute("items", cart.getProucts()); model.addAttribute("productForm", new ProductForm()); return "event"; } @PostMapping("/orders/remove") public String removeOrder(@RequestParam int orderID) { orderRepository.removeOrder(orderID); return "redirect:/orders"; } @PostMapping("/event/addProduct") public String addProduct(@ModelAttribute ProductForm productForm, Model model) { cart.addProduct(productForm.getProduct(), productForm.getNumber()); model.addAttribute("orderType", cart.getOrderType()); model.addAttribute("items", cart.getProucts()); model.addAttribute("productForm", new ProductForm()); return "redirect:/event"; } @PostMapping("/event/checkout") public String checkout(Model model) { LocalDateTime min = LocalDateTime.of(2023, (int) (Math.random() * 11 + 1.0), (int) (Math.random() * 27 + 1.0), (int) (Math.random() * 23 + 1.0), 0, 0); CustomOrder myOrder = new CustomOrder( cart.getOrderType(), min, min.plusDays((int) (Math.random() * 5)).plusHours((int) (Math.random() * 10)), cart.getProucts(), false, Math.round(Math.random() * 10000) ); orderRepository.addOrder(myOrder); model.addAttribute("orders", orderRepository.getOrders()); model.addAttribute("total", orderRepository.getOrders().size()); cart.resetCart(); return "redirect:/orders"; } @PostMapping("/event/changeOrderType") public String changeOrderType(@RequestParam(name = "orderType") Optional optionalOrderType, Model model) { String orderType = optionalOrderType.orElse("FOO"); switch (orderType) { case "RaK": cart.setOrderType(CustomOrder.OrderType.RENT_A_COOK); break; case "EK": cart.setOrderType(CustomOrder.OrderType.EVENT_CATERING); break; case "SN": cart.setOrderType(CustomOrder.OrderType.SUSHI_NIGHT); break; default: } return "redirect:/event"; } @GetMapping("/orders/calender") public String calender(Model model) { LocalDate startDate = LocalDate.now(); ArrayList>> weeksOfMonth = new ArrayList>>(4); for (int i = 0; i < 4; i++) { ArrayList datesOfTheWeek = new ArrayList(7); LocalDate startOfWeek = startDate.plusDays(7*i); LocalDate endOfWeekDate = startOfWeek.plusDays(6); for (LocalDate date = startOfWeek; !date.isAfter(endOfWeekDate); date = date.plusDays(1)) { datesOfTheWeek.add(date); } ArrayList> week_to_add_to_month = new ArrayList>(7); for (LocalDate date : datesOfTheWeek) { ArrayList x = new ArrayList(2); x.add(Integer.toString(date.getDayOfMonth())); week_to_add_to_month.add(x); } //datesOfTheWeek.clear(); weeksOfMonth.add(week_to_add_to_month); } LocalDate endDate = startDate.plusDays(27); // get orders_in_next_month (in future sorted by endDate) Iterable orders_in_next_month = this.orderRepository.getOrders().stream().filter(e -> !e.getFinish().toLocalDate().isBefore(startDate) && // end is not before today !e.getStart().toLocalDate().isAfter(endDate)).toList(); for (CustomOrder order : orders_in_next_month) { int start_index_inclusive = Math.max(order.getStart().toLocalDate().compareTo(startDate),0); int end_index_exclusive = Math.min(order.getFinish().toLocalDate().compareTo(startDate), 27) + 1; for (int i = start_index_inclusive; i < end_index_exclusive; i++) { weeksOfMonth.get((int) i/7).get(Math.floorMod(i,7)).add(Integer.toString(order.getId())); } } // for (List> orders_in_next_week : orders_in_next_month) { // orders_in_next_weeks.stream().filter(e -> // e.start.toLocalDate().isEqual(calender_day) || // start day // e.end.toLocalDate().isEqual(calender_day) || // end day // e.start.toLocalDate().isBefore(calender_day) && end.toLocalDate().isAfter(calender_day) // day in between start and end // ).toList().count(); // } // calendar header with names of week LocalDate endOfWeekDate = startDate.plusDays(6); ArrayList dayNames = new ArrayList(7); for (LocalDate date = startDate; !date.isAfter(endOfWeekDate); date = date.plusDays(1)) { dayNames.add(date.getDayOfWeek().toString()); } model.addAttribute("weeksOfMonth", weeksOfMonth); model.addAttribute("dayNames", dayNames); return "orders_calender"; } }