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

import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.Optional;

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

import de.ivu.elect.business.kandidatur.boundary.KandidaturDAO;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.PersonStatus;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.entity.NlKandidaturKonfliktPersonenregisterAbgleich;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonflikt;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktArt;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktPK;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktStatus;

@Stateless
@Specializes
public class NlPersonenKonfliktBoundaryCreate extends CommonPersonenKonfliktBoundaryCreate {

  @Inject
  private transient KandidaturDAO kandidaturDAO;

  public NlPersonenKonfliktBoundaryCreate() {
    super();
  }

  // ELECT-13358
  public Optional<PersonenKonfliktPK> initKandidaturKonfliktPersonenregisterAbgleich(Kandidatur template) {
    PersonenKonfliktPK result = null;

    Kandidatur kandidatur = kandidaturDAO.attach(template);

    PersonenKonfliktArt personenKonfliktArt = PersonenKonfliktArt.ABGLEICH_FEHLGESCHLAGEN;

    Collection<Personendaten> personendatenIdentischVerknuepft = new HashSet<>();
    personendatenIdentischVerknuepft.add(kandidatur);
    personendatenIdentischVerknuepft.addAll(kandidatur.getIdentischVerknuepftePersonen());

    personendatenIdentischVerknuepft.removeIf(personendaten -> !NlKandidaturKonfliktPersonenregisterAbgleich.isAbzugleichen(personendaten));

    // Alle müssen einen indentischen Konflikt erhalten...
    for (Personendaten personendaten : personendatenIdentischVerknuepft) {
      PersonenKonflikt personenKonflikt = create.findOrCreate(personendaten, personenKonfliktArt, PersonenKonfliktStatus.MANUELL_ZU_PRUEFEN);

      personendaten.setPersonStatus(PersonStatus.MANUELL_ZU_PRUEFENDER_KONFLIKT_VORHANDEN);

      if (Objects.equals(personendaten, kandidatur)) {
        result = personenKonflikt.getPk();
      }
    }

    return Optional.ofNullable(result);
  }
}
