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

import java.util.List;

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

import de.ivu.elect.business.benutzerverwaltung.entity.NonUniqueRolleUKException;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleArt;
import de.ivu.elect.business.benutzerverwaltung.entity.UniqueRolleUKValidator;
import de.ivu.elect.business.mandant.entity.Mandant;

@Stateless
public class RolleEdit extends AbstractRolleEdit {

  @Inject
  private transient UniqueRolleUKValidator uniqueRolleUKValidator;

  public RolleEdit() {
    super();
  }

  @Override
  protected void validate(Rolle entity) {
    assertUniqueRolleUk(entity);
  }

  private void assertUniqueRolleUk(Rolle rolle) {
    if (!isRolleUkUnique(rolle)) {
      throw new NonUniqueRolleUKException(rolle.getRolleUK());
    }
  }

  private boolean isRolleUkUnique(Rolle rolle) {
    return uniqueRolleUKValidator.isUniqueRolleUKExtendedPersistenceContext(rolle);
  }

  public void updateRolleArtFuerAlleRollen(Mandant mandant) {
    List<Rolle> wahlRollen = dao.findByRolleArt(mandant, RolleArt.WAHL);
    List<Rolle> tatsaechlicheWahlRollen = dao.findByWahlRolle(mandant);

    List<Rolle> gebietRollen = dao.findByRolleArt(mandant, RolleArt.GEBIET);
    List<Rolle> tatsaechlicheGebietRollen = dao.findByGebietRolle(mandant);

    tatsaechlicheWahlRollen.stream().filter(rolle -> !wahlRollen.contains(rolle)).forEach(rolle -> rolle.setRolleArt(RolleArt.WAHL));

    wahlRollen.stream().filter(rolle -> !tatsaechlicheWahlRollen.contains(rolle)).forEach(rolle -> {
      if (tatsaechlicheGebietRollen.contains(rolle)) {
        rolle.setRolleArt(RolleArt.GEBIET);
        // ELECT-14972
        //      } else {
//        rolle.setRolleArt(RolleArt.FACHLICH);
      }
    });

    tatsaechlicheGebietRollen.stream().filter(rolle -> !gebietRollen.contains(rolle)).forEach(rolle -> rolle.setRolleArt(RolleArt.GEBIET));
    gebietRollen.stream().filter(rolle -> !tatsaechlicheGebietRollen.contains(rolle)).forEach(rolle -> {
      if (tatsaechlicheWahlRollen.contains(rolle)) {
        rolle.setRolleArt(RolleArt.WAHL);
        // ELECT-14972
//      } else {
//        rolle.setRolleArt(RolleArt.FACHLICH);
      }
    });
  }
}
