
package de.ivu.elect.business.benutzerverwaltung.boundary;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.control.RechteKonfigurationAktualisierenEvent;
import de.ivu.elect.business.benutzerverwaltung.entity.RechteKonfiguration;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.security.UseCasePermission;

/**
 *  on 05.06.2015.
 */

@Stateless
public class RechteTestmodusEdit implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient RechteKonfigurationDAO rechteKonfigurationDAO;

  @Inject
  private transient RechteKonfigurationCreate rechteKonfigurationCreate;

  @Inject
  private transient RechteKonfigurationAktualisierenEvent rechteKonfigurationAktualisierenEvent;

  public RechteTestmodusEdit() {
    super();
  }

  public void saveRechteFuerTestmodus(Mandant mandant, Collection<UseCasePermission> rechte) {
    Set<UseCasePermission> nochZuSpeichern = new HashSet<>(rechte);

    for (RechteKonfiguration rechteKonfiguration : rechteKonfigurationDAO.findByAll(mandant)) {
      boolean nurImTestmodusAktiv = nochZuSpeichern.contains(rechteKonfiguration.getRecht());
      rechteKonfiguration.setNurImTestmodusAktiv(nurImTestmodusAktiv);
      nochZuSpeichern.remove(rechteKonfiguration.getRecht());
    }

    for (UseCasePermission useCasePermission : nochZuSpeichern) {
      RechteKonfiguration rechteKonfiguration = new RechteKonfiguration();
      rechteKonfiguration.setMandant(mandant);
      rechteKonfiguration.setNurImTestmodusAktiv(true);
      rechteKonfiguration.setRecht(useCasePermission);
      rechteKonfigurationCreate.save(rechteKonfiguration);
    }

    rechteKonfigurationDAO.flush(); // damit beim Event alle Rechte in der DB sind...
    rechteKonfigurationAktualisierenEvent.sendChangeEvent();
  }

  public List<UseCasePermission> getRechteFuerTestmodus(Mandant mandant) {
    return rechteKonfigurationDAO.findByAll(mandant).stream().filter(RechteKonfiguration::getNurImTestmodusAktiv).map(RechteKonfiguration::getRecht)
        .collect(Collectors.toList());
  }
}
