package fr.mch.mdo.restaurant.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import fr.mch.mdo.restaurant.beans.dto.AcknowledgmentMessage;
import fr.mch.mdo.restaurant.beans.dto.DinnerTableDto;
import fr.mch.mdo.restaurant.beans.dto.OrderLineDto;
import fr.mch.mdo.restaurant.exception.MdoException;
import fr.mch.mdo.restaurant.services.business.managers.IOrdersManager;
import fr.mch.mdo.restaurant.services.business.managers.TableState;
import fr.mch.mdo.restaurant.ui.forms.FindOrderLineForm;
import fr.mch.mdo.restaurant.ui.forms.ResetTableForm;
import fr.mch.mdo.restaurant.ui.forms.SaveOrderLineForm;
import fr.mch.mdo.restaurant.ui.forms.TableHeaderForm;
@Controller
@RequestMapping(OrdersController.ORDERS_CONTROLLER)
public final class OrdersController extends AbstractController
{
public static final String ORDERS_CONTROLLER = "/orders";
public static final String RESET_TABLE_DINNER_TABLE_ID = "/reset/table/{dinnerTableId}";
public static final String CREATE_TABLE_RESTAURANT_ID_USER_AUTHENTICATION_ID_VIEW = "/create/table/{restaurantId}/{userAuthenticationId}/view";
public static final String FIND_TABLE_ID_VIEW = "/find/table/{id}/view";
public static final String FIND_TABLE_ID_LOC_ID_VIEW = "/find/table/{id}/{locId}/view";
public static final String DELETE_TABLE_ID_VIEW = "/delete/table/{id}/view";
public static final String RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLES_STATE_VIEW = "/{restaurantId}/{userAuthenticationId}/tables/{state}/view";
public static final String RESTAURANT_ID_TABLES_STATE_VIEW = "/{restaurantId}/tables/{state}/view";
public static final String RESTAURANT_ID_FIND_ORDER_LINE_CODE = "/{restaurantId}/find/order/line";
public static final String RESTAURANT_ID_FIND_ORDER_LINE_CODE_LOC_ID = "/{restaurantId}/find/order/line/{locId}";
public static final String CREATE_TABLE_RESTAURANT_ID_USER_AUTHENTICATION_ID = "/create/table/{restaurantId}/{userAuthenticationId}";
public static final String UPDATE_TABLE_ID_CUSTOMERS_NUMBER_CUSTOMERS_NUMBER = "/update/table/{id}/customers/number/{customersNumber}";
public static final String TABLE_ORDERS_SIZE_ID = "/table/orders/size/{dinnerTableId}";
public static final String FIND_TABLE_ID = "/find/table/{id}";
public static final String FIND_TABLE_ID_LOC_ID = "/find/table/{id}/{locId}";
public static final String SAVE_ORDER_LINE = "/save/order/line";
public static final String DELETE_TABLE_ID = "/delete/table/{id}";
public static final String RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLE_HEADER_BY_NUMBER_NUMBER = "/{restaurantId}/{userAuthenticationId}/table/header/by/number/{number}";
public static final String RESTAURANT_ID_TABLE_HEADER_BY_NUMBER_NUMBER = "/{restaurantId}/table/header/by/number/{number}";
public static final String DELETE_ORDER_LINE_ID = "/delete/order/line/{id}";
public static final String RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLES_STATE = "/{restaurantId}/{userAuthenticationId}/tables/{state}";
public static final String RESTAURANT_ID_TABLES_STATE = "/{restaurantId}/tables/{state}";
@Inject
@Named("OrdersManager")
private IOrdersManager manager;
@RequestMapping(value = RESTAURANT_ID_TABLES_STATE, method = RequestMethod.GET)
@ResponseBody
public List<DinnerTableDto> tables(@PathVariable Long restaurantId, @PathVariable String state) throws Exception {
return this.tables(restaurantId, null, state);
}
@RequestMapping(value = RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLES_STATE, method = RequestMethod.GET)
@ResponseBody
public List<DinnerTableDto> tables(@PathVariable Long restaurantId, @PathVariable Long userAuthenticationId, @PathVariable String state) throws MdoException {
List<DinnerTableDto> tables = new ArrayList<DinnerTableDto>();
// Checking type table before calling manager specific method
tables = manager.findAllTables(restaurantId, userAuthenticationId, TableState.valueOf(state));
return tables;
}
@RequestMapping(value = RESTAURANT_ID_TABLE_HEADER_BY_NUMBER_NUMBER, method = RequestMethod.GET)
@ResponseBody
public DinnerTableDto tableHeader(@PathVariable Long restaurantId, @PathVariable String number) throws MdoException {
DinnerTableDto result = manager.findTableHeader(restaurantId, number);
return result;
}
@RequestMapping(value = RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLE_HEADER_BY_NUMBER_NUMBER)
@ResponseBody
public DinnerTableDto tableHeader(@PathVariable Long restaurantId, @PathVariable Long userAuthenticationId, @PathVariable String number) throws MdoException {
DinnerTableDto result = manager.findTableHeader(restaurantId, userAuthenticationId, number);
return result;
}
@RequestMapping(value = DELETE_TABLE_ID, method = RequestMethod.DELETE)
@ResponseBody
public AcknowledgmentMessage deleteTable(@PathVariable Long id) {
AcknowledgmentMessage ack = new AcknowledgmentMessage();
try {
manager.deleteTable(id);
} catch (MdoException e) {
ack.setType(AcknowledgmentMessage.Type.ERROR);
ack.setTitle("delete.table.error.ack.title");
ack.setMessage("delete.table.error.ack.message");
}
return ack;
}
@RequestMapping(value = FIND_TABLE_ID)
@ResponseBody
public DinnerTableDto findTable(@PathVariable Long id, Locale locale) throws MdoException {
DinnerTableDto table = manager.findTable(id, locale);
return table;
}
@RequestMapping(value = FIND_TABLE_ID_LOC_ID)
@ResponseBody
public DinnerTableDto findTable(@PathVariable Long id, @PathVariable Long locId) throws MdoException {
DinnerTableDto table = manager.findTable(id, locId);
return table;
}
@RequestMapping(value = UPDATE_TABLE_ID_CUSTOMERS_NUMBER_CUSTOMERS_NUMBER, method = RequestMethod.POST)
@ResponseBody
public AcknowledgmentMessage updateTableCustomersNumber(@PathVariable Long id, @PathVariable Integer customersNumber) {
AcknowledgmentMessage ack = new AcknowledgmentMessage();
try {
manager.updateTableCustomersNumber(id, customersNumber);
} catch (MdoException e) {
ack.setType(AcknowledgmentMessage.Type.ERROR);
ack.setTitle("update.table.customers.number.error.ack.title");
ack.setMessage("update.table.customers.number.error.ack.message");
}
return ack;
}
@RequestMapping(value = RESET_TABLE_DINNER_TABLE_ID, method = RequestMethod.POST)
@ResponseBody
public AcknowledgmentMessage resetTable(@PathVariable Long dinnerTableId, @RequestBody ResetTableForm form) {
AcknowledgmentMessage ack = new AcknowledgmentMessage();
try {
manager.resetTable(dinnerTableId, form.getRestaurantId(), form.getUserAuthenticationId(), form.getNumber(), form.getCustomersNumber());
} catch (MdoException e) {
ack.setType(AcknowledgmentMessage.Type.ERROR);
ack.setTitle("reset.table.creation.date.customers.number.error.ack.title");
ack.setMessage("reset.table.creation.date.customers.number.error.ack.message");
}
return ack;
}
/**
*
* @param header this field could be validated with JSR.
* @return
* @throws MdoException
*/
@RequestMapping(value = CREATE_TABLE_RESTAURANT_ID_USER_AUTHENTICATION_ID, method = RequestMethod.POST)
@ResponseBody
public DinnerTableDto createTable(@PathVariable Long restaurantId, @PathVariable Long userAuthenticationId, @RequestBody TableHeaderForm header) throws MdoException {
DinnerTableDto table = manager.createTable(restaurantId, userAuthenticationId, header.getNumber(), header.getCustomersNumber());
return table;
}
@RequestMapping(value = TABLE_ORDERS_SIZE_ID)
@ResponseBody
public Integer tableOrdersSize(@PathVariable Long dinnerTableId) throws MdoException {
Integer result = manager.getTableOrdersSize(dinnerTableId);
return result;
}
@RequestMapping(value = RESTAURANT_ID_FIND_ORDER_LINE_CODE, method = RequestMethod.POST)
@ResponseBody
public OrderLineDto findOrderLine(@PathVariable Long restaurantId, @RequestBody FindOrderLineForm form, Locale locale) throws MdoException {
// Here, we use POST instead of GET because of user entry Quantity and OrderCode that could contain special characters.
OrderLineDto orderLine = manager.getOrderLine(restaurantId, form.getQuantity(), form.getOrderCode(), locale);
return orderLine;
}
@RequestMapping(value = RESTAURANT_ID_FIND_ORDER_LINE_CODE_LOC_ID, method = RequestMethod.POST)
@ResponseBody
public OrderLineDto findOrderLine(@PathVariable Long restaurantId, @PathVariable Long locId, @RequestBody FindOrderLineForm form) throws MdoException {
// Here, we use POST instead of GET because of user entry Quantity and OrderCode that could contain special characters.
OrderLineDto orderLine = manager.getOrderLine(restaurantId, form.getQuantity(), form.getOrderCode(), locId);
return orderLine;
}
@RequestMapping(value = SAVE_ORDER_LINE, method = RequestMethod.POST)
@ResponseBody
public AcknowledgmentMessage saveOrderLine(@RequestBody SaveOrderLineForm form) {
AcknowledgmentMessage ack = new AcknowledgmentMessage();
try {
Long savedId = manager.saveOrderLine(form.getOrderLine());
ack.setAttachment(savedId);
} catch (MdoException e) {
ack.setType(AcknowledgmentMessage.Type.ERROR);
ack.setTitle("save.order.line.error.ack.title");
ack.setMessage("save.order.line.error.ack.message");
}
return ack;
}
@RequestMapping(value = DELETE_ORDER_LINE_ID, method = RequestMethod.DELETE)
@ResponseBody
public AcknowledgmentMessage deleteOrderLine(@PathVariable Long id) {
AcknowledgmentMessage ack = new AcknowledgmentMessage();
try {
manager.deleteOrderLine(id);
} catch (MdoException e) {
ack.setType(AcknowledgmentMessage.Type.ERROR);
ack.setTitle("delete.order.line.error.ack.title");
ack.setMessage("delete.order.line.error.ack.message");
}
return ack;
}
@RequestMapping(RESTAURANT_ID_TABLES_STATE_VIEW)
public String tablesView(@PathVariable Long restaurantId, @PathVariable String state, Model model) throws Exception {
List<DinnerTableDto> tables = this.tables(restaurantId, state);
model.addAttribute("tables", tables);
return "orders/tables";
}
@RequestMapping(RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLES_STATE_VIEW)
public String tablesView(@PathVariable Long restaurantId, @PathVariable Long userAuthenticationId, @PathVariable String state, Model model) throws Exception {
List<DinnerTableDto> tables = this.tables(restaurantId, userAuthenticationId, state);
model.addAttribute("tables", tables);
return "orders/tables";
}
@RequestMapping(value = DELETE_TABLE_ID_VIEW, method = RequestMethod.DELETE)
public String deleteTableView(@PathVariable Long id, Model model) throws MdoException {
this.deleteTable(id);
String type = "ALL";
return "redirect:/orders/tables/" + type + "/view";
}
@RequestMapping(FIND_TABLE_ID_VIEW)
public String findTableView(@PathVariable Long id, Locale locale, Model model) throws MdoException {
DinnerTableDto table = this.findTable(id, locale);
model.addAttribute("table", table);
return "orders/table";
}
@RequestMapping(FIND_TABLE_ID_LOC_ID_VIEW)
public String findTableView(@PathVariable Long id, @PathVariable Long locId, Model model) throws MdoException {
DinnerTableDto table = this.findTable(id, locId);
model.addAttribute("table", table);
return "orders/table";
}
/**
*
* @param header this field could be validated with JSR.
* @param model
* @return
* @throws MdoException
*/
@RequestMapping(value = CREATE_TABLE_RESTAURANT_ID_USER_AUTHENTICATION_ID_VIEW, method = RequestMethod.POST)
public String createTableView(@PathVariable Long restaurantId, @PathVariable Long userAuthenticationId, @RequestBody TableHeaderForm header, Model model) throws MdoException {
DinnerTableDto table = this.createTable(restaurantId, userAuthenticationId, header);
return "redirect:/find/table/"+ table.getId() + "/view";
}
}