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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;

import java.util.Collection;
import java.util.HashSet;

import javax.inject.Inject;

import de.ivu.elect.business.person.boundary.PersonendatenVerknuepfer;
import de.ivu.elect.business.person.entity.PersonenVerknuepfung;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.VerknuepfungsArt;
import de.ivu.elect.business.person.entity.VerknuepfungsGrundlage;
import de.ivu.elect.business.person.entity.VerknuepfungsStatus;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;

public class WahlvorschlagsPersonPoolPersonenVerknuepfungResolver {

  public static final VerknuepfungsArt VERKNUEPFUNGS_ART = VerknuepfungsArt.WAHLVORSCHLAG_DUBLETTE;

  public static final VerknuepfungsGrundlage VERKNUEPFUNGS_GRUNDLAGE = VerknuepfungsGrundlage.MANUELL;

  public static final VerknuepfungsStatus VERKNUEPFUNGS_STATUS = VerknuepfungsStatus.IDENTISCH;

  @Inject
  private PersonendatenVerknuepfer personendatenVerknuepfer;

  public WahlvorschlagsPersonPoolPersonenVerknuepfungResolver() {
    super();
  }

  public Collection<WahlvorschlagsPerson> getWahlvorschlagsPersonenVerknuepft(WahlvorschlagsPerson wahlvorschlagsPerson) {
    Collection<WahlvorschlagsPerson> result = new HashSet<>();

    result.add(wahlvorschlagsPerson);

    Collection<PersonenVerknuepfung> personenVerknuepfungen = wahlvorschlagsPerson
        .getPersonenVerknuepfungenByVerknuepfungsArt(VERKNUEPFUNGS_ART);

    for (PersonenVerknuepfung personenVerknuepfung : personenVerknuepfungen) {
      if (VERKNUEPFUNGS_GRUNDLAGE.equals(personenVerknuepfung.getVerknuepfungsGrundlage())
          && VERKNUEPFUNGS_STATUS.equals(personenVerknuepfung.getVerknuepfungsStatus())) {
        Personendaten person1 = personenVerknuepfung.getPerson1();
        Personendaten person2 = personenVerknuepfung.getPerson2();

        if (isRelevantWahlvorschlagsPerson(person1) && isRelevantWahlvorschlagsPerson(person2)) {
          result.add(castTo(person1, WahlvorschlagsPerson.class));
          result.add(castTo(person2, WahlvorschlagsPerson.class));
        }
      }
    }

    return result;
  }

  private boolean isRelevantWahlvorschlagsPerson(Personendaten personendaten) {
    return personendaten != null && personendaten.isInstanceOf(WahlvorschlagsPerson.class)
        && !castTo(personendaten, WahlvorschlagsPerson.class).isUnterstuetzer();
  }

  public PersonenVerknuepfung createWahlvorschlagsPersonPoolPersonenVerknuepfung(WahlvorschlagsPerson wahlvorschlagsPerson,
      WahlvorschlagsPerson wahlvorschlagsPersonVerknuepft) {
    return personendatenVerknuepfer.verknuepfe(VERKNUEPFUNGS_ART, wahlvorschlagsPerson, wahlvorschlagsPersonVerknuepft,
        VERKNUEPFUNGS_GRUNDLAGE, VERKNUEPFUNGS_STATUS);
  }
}
