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

import de.ivu.elect.business.person.entity.PersonenVerknuepfung;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.control.PersonenPruefungVorbereiter;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonflikt;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktArt;

import javax.ejb.Stateless;
import javax.inject.Inject;
import java.io.Serializable;
import java.util.*;

@Stateless
public class KonflikteErneutPruefer implements Serializable {

  @Inject
  private transient PersonenPruefungVorbereiter personenPruefungVorbereiter;

  @Inject
  private transient PersonenKonfliktEdit personenKonfliktEdit;

  @Inject
  private transient PersonenPruefungStarter personenPruefungStarter;

  public void konflikteZurErneutenPruefungVorbereiten(Collection<PersonenKonflikt> personKonflikte, boolean startePersonenPruefung) {
    List<PersonenKonflikt> zuLoeschendeKonflikte = new ArrayList<>();
    for (PersonenKonflikt personenKonflikt : personKonflikte) {
      preparePruefSchrittFuerKonflikt(personenKonflikt, zuLoeschendeKonflikte);
    }
    personenKonfliktEdit.delete(zuLoeschendeKonflikte);
    if (startePersonenPruefung) {
      personenPruefungStarter.startePersonenPruefung();
    }
  }

  protected void preparePruefSchrittFuerKonflikt(PersonenKonflikt personenKonflikt, List<PersonenKonflikt> zuLoeschendeKonflikte) {
    Set<PersonenKonfliktArt> konfliktArten = new HashSet<>();
    Personendaten personendaten = personenKonflikt.getPersonendaten();
    personendaten.getPersonStatus(); // eager Loading
    switch (personenKonflikt.getPersonenKonfliktArt()) {
      case ABGLEICH_FEHLGESCHLAGEN:
        personenPruefungVorbereiter.addKonfliktArtAndPreparePersonendatenForPersonenregisterAbgleichPruefSchritt(konfliktArten, personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case POTENTIELLE_DUBLETTE:
        for (PersonenVerknuepfung personenVerknuepfung : personendaten.getPersonenVerknuepfungen()) {
          personenVerknuepfung.getPersonen(); // eager loading
        }
        personenPruefungVorbereiter.addKonfliktArtAndPreparePersonendatenForDublettenPruefSchritt(konfliktArten, personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case MEHRSTAATIGKEIT_PRUEFUNG_FEHLGESCHLAGEN:
        personenPruefungVorbereiter.addKonfliktArtAndPreparePersonendatenForMehrstaatigkeitPruefSchritt(konfliktArten, personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case WAHLRECHTLICHE_PRUEFUNG_FEHLGESCHLAGEN:
        personenPruefungVorbereiter.addKonfliktArtAndPreparePersonendatenForWahlrechtPruefSchritt(konfliktArten, personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case WERTELISTEN_ABGLEICH_FEHLGESCHLAGEN:
        personenPruefungVorbereiter.addKonfliktArtAndPreparePersonendatenForWertelistenAbgleichPruefSchritt(konfliktArten, personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case KONTODATENAENDERUNG_BEARBEITER_BESTAETIGUNG_ERFORDERLICH:
        personenPruefungVorbereiter.addKonfliktArtAndPreparePersonendatenForKontodatenaenderungBearbeiterBestaetigungErforderlichPruefSchritt(konfliktArten, personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case KONTOVERBINDUNG_MEHRFACH_ANGEGEBEN:
        personenPruefungVorbereiter.addKonfliktArtAndPreparePersonendatenForKontoverbindungMehrfachAngegebenPruefSchritt(konfliktArten, personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case KONTOVERBINDUNG_KONTODATEN_UNGUELTIG:
      case SICHTPRUEFUNG_NOTWENDIG:
      case KORREKTUR_NACH_SICHTPRUEFUNG_NOTWENDIG:
        personenPruefungVorbereiter.markPersonendatenUngeprueft(personendaten);
        zuLoeschendeKonflikte.add(personenKonflikt);
        break;
      case AUF_SPERRLISTE_GEFUNDEN: // nur WOS
      case EINSATZWUNSCH_BEMERKUNG_VORHANDEN: // nur WOS
      case WAHLHELFERDATENBANK_ABGLEICH_FEHLGESCHLAGEN: // nur WOS
      case ABWESEND:
        // nichts tun, da nicht relevant
        break;
      default:
        throw new UnsupportedOperationException("PersonenKonfliktArt " + personenKonflikt.getPersonenKonfliktArt() + " wird bei der Vorbereitung zur erneuten Prüfung nicht unterstützt.");
    }
  }

}
