package com.plannaplan.services; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; import com.plannaplan.entities.Assignment; import com.plannaplan.entities.Commision; import com.plannaplan.entities.Exchange; import com.plannaplan.entities.Groups; import com.plannaplan.entities.User; import com.plannaplan.models.MatchData; import com.plannaplan.repositories.ExchangeRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ExchangeService { @Autowired private ExchangeRepository repo; @Autowired private AssignmentService assignmentService; @Autowired private UserService userService; /** * @param exchange Instance to save in database * @return Exchange Instance contains database id */ public Exchange save(Exchange exchange) { return this.repo.save(exchange); } /** * @param id Id of exchange in database * @return Optional Exchange if found */ public Optional getById(Long id) { return this.repo.findById(id); } public List getAllExchanges() { return this.repo.findAll(); } /** * @param id Id of user * @return List of exchanges that belong to user */ public List getByUserId(Long id) { return this.repo.getByUserId(id); } /** * @param entity Exchange entity which we would like to delete */ public void deleteExchange(Exchange entity) { this.repo.delete(entity); } /** * @param assignment Assignment to trade for * @param group Desired group * @return Optional with Exchange if exist */ public Optional checkForExchange(Assignment assignment, Groups group) { return this.repo.checkForExchange(assignment, group); } public void performExchange() { final Set matchData = this.getMatches(); final List performedAssignmentExchanges = new ArrayList<>(); matchData.forEach( m -> { final Assignment assignmentOne = m.getAssignmentOne(); final Assignment assignmentTwo = m.getAssignmentTwo(); if (!(performedAssignmentExchanges.contains(assignmentOne.getId()) || performedAssignmentExchanges.contains(assignmentTwo.getId()))){ final Commision commisionOne = assignmentOne.getCommision(); final User userOne = commisionOne.getCommisionOwner(); final Commision commisionTwo = assignmentTwo.getCommision(); final User userTwo = commisionTwo.getCommisionOwner(); assignmentOne.setCommision(commisionTwo); assignmentTwo.setCommision(commisionOne); userOne.removeGroup(assignmentOne.getGroup().getId()); userTwo.removeGroup(assignmentTwo.getGroup().getId()); userOne.claimGroup(assignmentTwo.getGroup()); userTwo.claimGroup(assignmentOne.getGroup()); this.assignmentService.save(assignmentOne); this.assignmentService.save(assignmentTwo); this.userService.save(userOne); this.userService.save(userTwo); performedAssignmentExchanges.add(assignmentOne.getId()); performedAssignmentExchanges.add(assignmentTwo.getId()); } this.deleteExchange(m.getExchangeOne()); this.deleteExchange(m.getExchangeTwo()); }); } public Set getMatches(){ final List matches = this.repo.getMatches().stream().map(m -> { final Exchange exchangeOne = (Exchange) m[0]; final Exchange exchangeTwo = (Exchange) m[1]; return new MatchData(exchangeOne, exchangeTwo); }).collect(Collectors.toList()); Set filterMatches = new TreeSet<>((m1, m2) -> m1.compare(m2)); filterMatches.addAll(matches); return filterMatches; } }