package org.dicadeveloper.weplantaforest.admin.event;
import java.util.List;
import javax.transaction.Transactional;
import org.dicadeveloper.weplantaforest.admin.cart.Cart;
import org.dicadeveloper.weplantaforest.admin.cart.CartRepository;
import org.dicadeveloper.weplantaforest.admin.cart.CartState;
import org.dicadeveloper.weplantaforest.admin.code.Code;
import org.dicadeveloper.weplantaforest.admin.code.CodeRepository;
import org.dicadeveloper.weplantaforest.admin.code.CodeService;
import org.dicadeveloper.weplantaforest.common.errorHandling.ErrorCodes;
import org.dicadeveloper.weplantaforest.common.errorHandling.IpatException;
import org.dicadeveloper.weplantaforest.common.errorHandling.IpatPreconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EventService {
@Autowired
private EventRepository _eventRepository;
@Autowired
private CodeService _codeService;
@Autowired
CodeRepository _codeRepository;
@Autowired
CartRepository _cartRepository;
public Event create(Event event) throws IpatException {
IpatPreconditions.checkNotNull(event, ErrorCodes.EVENT_IS_NULL);
IpatPreconditions.checkArgument(event.getId() == null, ErrorCodes.EVENT_ALREADY_EXISTS);
return _eventRepository.save(event);
}
public Event getEvent(Long eventId) throws IpatException {
Event event = _eventRepository.findOne(eventId);
IpatPreconditions.checkNotNull(event, ErrorCodes.EVENT_IS_NULL);
return event;
}
@Transactional
public void delete(Long eventId) throws IpatException {
Event event = getEvent(eventId);
List<Cart> cartsForEvent = _cartRepository.findByEvent(event);
List<Code> codesForEvent = _codeRepository.findByEvent(event);
for (Cart cart : cartsForEvent) {
if (cart.getCartState().equals(CartState.VERIFIED)) {
throw new IpatException(ErrorCodes.CART_ALREADY_REDEEMED);
}
}
for (Cart cart : cartsForEvent) {
_cartRepository.delete(cart);
}
for (Code code : codesForEvent) {
_codeRepository.delete(code);
}
_eventRepository.delete(event);
}
public Event update(Event event) throws IpatException {
IpatPreconditions.checkNotNull(event, ErrorCodes.EVENT_IS_NULL);
IpatPreconditions.checkNotNull(event.getId(), ErrorCodes.EVENT_ALREADY_EXISTS);
return _eventRepository.save(event);
}
@Transactional
public void generateCodes(Long eventId, List<Long> cartIds) throws IpatException {
Event event = _eventRepository.findOne(eventId);
IpatPreconditions.checkNotNull(event, ErrorCodes.EVENT_NOT_FOUND);
for (int i = 0; i < cartIds.size(); i++) {
generateCode(event, cartIds.get(i));
}
}
private void generateCode(Event event, Long cartId) throws IpatException {
Cart cart = _cartRepository.findOne(cartId);
IpatPreconditions.checkNotNull(event, ErrorCodes.CART_IS_NULL);
Code code = _codeService.generateCode();
code.setEvent(event);
code = _codeRepository.save(code);
cart.setEvent(event);
cart.setCode(code);
_cartRepository.save(cart);
//TODO: think about to remove one of both references
code.setCart(cart);
_codeRepository.save(code);
}
}