/**
* Copyright © 2015 Pablo Grela Palleiro (pablogp_9@hotmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.cuacfm.members.model.reserveservice;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.cuacfm.members.model.account.Account;
import org.cuacfm.members.model.accountservice.AccountService;
import org.cuacfm.members.model.elementservice.ElementService;
import org.cuacfm.members.model.eventservice.EventService;
import org.cuacfm.members.model.exceptions.DatesException;
import org.cuacfm.members.model.exceptions.UserAlreadyReserveException;
import org.cuacfm.members.model.reserve.Reserve;
import org.cuacfm.members.model.reserve.ReserveDTO;
import org.cuacfm.members.model.reserve.ReserveRepository;
import org.cuacfm.members.model.util.Constants.levels;
import org.cuacfm.members.model.util.Constants.states;
import org.cuacfm.members.model.util.DateUtils;
import org.cuacfm.members.model.util.PushService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Service;
/** The Class ReserveServiceImpl. */
@Service("reserveService")
public class ReserveServiceImpl implements ReserveService {
private static final Logger logger = LoggerFactory.getLogger(ReserveServiceImpl.class);
@Autowired
private MessageSource messageSource;
@Autowired
private AccountService accountService;
@Autowired
private ElementService elementService;
@Autowired
private ReserveRepository reserveRepository;
@Autowired
private EventService eventService;
/** Instantiates a new reserve service. */
public ReserveServiceImpl() {
super();
}
@Override
public Reserve save(Reserve reserve) throws DatesException, UserAlreadyReserveException {
logger.info("save reserve");
Object[] arguments = { reserve.getElement().getName() };
if (reserve.getDateStart().before(new Date())) {
throw new DatesException(reserve.getDateStart(), new Date());
} else if (reserve.getDateEnd().before(reserve.getDateStart())) {
throw new DatesException(reserve.getDateStart(), reserve.getDateEnd());
}
// Query to maybe reserves of element
String message = "reserve.create.success";
List<Reserve> reserves = reserveRepository.getReserveListConflicts(reserve);
if (!reserves.isEmpty()) {
String answer = messageSource.getMessage("reserve.create.conflict", null, Locale.getDefault());
for (Reserve aux : reserves) {
if (reserve.getAccount().getId().equals(aux.getAccount().getId())) {
throw new UserAlreadyReserveException(reserve.getElement().getName());
}
reserve.setAnswer(answer + " " + aux.getAccount().getFullName() + " \n");
}
message = "reserve.create.warning";
}
// Save Message Event
eventService.save(message, reserve.getAccount(), levels.HIGH, arguments);
return reserveRepository.save(reserve);
}
@Override
public Reserve update(Reserve reserve) throws DatesException {
logger.info("update reserve");
Object[] arguments = { reserve.getElement().getName() };
if (reserve.getDateEnd().before(reserve.getDateStart())) {
eventService.save("reserve.dateStart.error", null, levels.HIGH, arguments);
throw new DatesException(reserve.getDateStart(), reserve.getDateEnd());
}
// Save Message Event
eventService.save("reserve.edit.success", null, levels.MEDIUM, arguments);
return reserveRepository.update(reserve);
}
@Override
public void delete(Reserve reserve) {
delete(reserve, null);
}
@Override
public void delete(Reserve reserve, Account account) {
reserveRepository.delete(reserve);
}
@Override
public Reserve findById(Long id) {
return reserveRepository.findById(id);
}
@Override
public List<Reserve> getReserveList() {
return reserveRepository.getReserveList();
}
@Override
public List<Reserve> getReserveListActive() {
return reserveRepository.getReserveListActive();
}
@Override
public List<Reserve> getReserveListByUser(Account account) {
return reserveRepository.getReserveListByUser(account);
}
@Override
public List<Reserve> getReserveListActiveByUser(Account account) {
return reserveRepository.getReserveListActiveByUser(account);
}
@Override
public List<Reserve> getReserveListClose() {
return reserveRepository.getReserveListClose();
}
@Override
public void up(Reserve reserve) {
reserve.setActive(true);
reserve.setDateRevision(null);
reserve.setDateApproval(null);
reserve.setState(states.MANAGEMENT);
reserveRepository.update(reserve);
Object[] arguments = { reserve.getElement().getName() };
eventService.save("reserve.up.sucess", null, levels.MEDIUM, arguments);
}
@Override
public void accept(Reserve reserve) {
reserve.setActive(false);
reserve.setDateRevision(new Date());
reserve.setDateApproval(new Date());
reserve.setState(states.ACCEPT);
reserveRepository.update(reserve);
Object[] arguments = { reserve.getElement().getName() };
eventService.save("reserve.accept.success", null, levels.HIGH, arguments);
}
@Override
public void deny(Reserve reserve) {
reserve.setActive(false);
reserve.setDateRevision(new Date());
reserve.setDateApproval(null);
reserve.setState(states.DENY);
reserveRepository.update(reserve);
Object[] arguments = { reserve.getElement().getName() };
eventService.save("reserve.deny.success", null, levels.HIGH, arguments);
}
@Override
public Reserve answer(Reserve reserve, Account account, String answer, Boolean manage) {
String log = "";
if (reserve.getAnswer() != null) {
log = reserve.getAnswer();
}
String aux = DateUtils.format(new Date(), DateUtils.FORMAT_DISPLAY) + " - " + account.getName() + "\n";
reserve.setAnswer(aux + "\t" + answer + "\n" + log);
Object[] arguments = { account.getFullName(), reserve.getElement().getName() };
eventService.save("reserve.answer.user", reserve.getAccount(), levels.HIGH, arguments);
// Send push
if (!account.getId().equals(reserve.getAccount().getId())) {
Object[] arguments2 = { reserve.getElement().getName() };
String title = messageSource.getMessage("reserve.answer.push.title", arguments2, Locale.getDefault());
PushService.sendPushNotificationToDevice(reserve.getAccount().getDevicesToken(), title, answer);
}
if (manage == null) {
reserveRepository.update(reserve);
} else if (manage) {
accept(reserve);
} else {
deny(reserve);
}
return reserve;
}
@Override
public List<ReserveDTO> getReservesDTO(List<Reserve> reserves) {
List<ReserveDTO> reservesDTO = new ArrayList<>();
for (Reserve reserve : reserves) {
reservesDTO.add(getReserveDTO(reserve));
}
return reservesDTO;
}
@Override
public ReserveDTO getReserveDTO(Reserve reserve) {
ReserveDTO reserveDTO = null;
if (reserve != null) {
reserveDTO = new ReserveDTO(reserve.getId(), accountService.getAccountDTO(reserve.getAccount()),
elementService.getElementDTO(reserve.getElement()), reserve.getDescription(), reserve.getAnswer(), reserve.getDateCreate(),
reserve.getDateStart(), reserve.getDateEnd(), reserve.getDateRevision(), reserve.getDateApproval(), reserve.getState(),
reserve.isActive());
}
return reserveDTO;
}
@Override
public Reserve getReserve(ReserveDTO reserveDTO, Account account) {
if (account == null) {
account = accountService.findByEmail(reserveDTO.getAccount().getEmail());
}
return new Reserve(account, elementService.findByName(reserveDTO.getElement().getName()), reserveDTO.getDescription(),
reserveDTO.getDateStart(), reserveDTO.getDateEnd());
}
}