
package de.ivu.elect.business.kandidatur.control;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.control.GewaehltCreate;
import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturListenpositionResolver;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.personenpruefung.boundary.PersonenPruefungStarter;
import de.ivu.elect.business.staat.boundary.StaatDAO;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;

public class ListenkandidaturCreate extends AbstractListenkandidaturCreate {

  @Inject
  protected transient WahlDAO wahlDao;

  @Inject
  protected transient StaatDAO staatDao;

  @Inject
  protected transient ListeDAO listeDao;

  @Inject
  protected transient ListenkandidaturListenpositionResolver listenkandidaturListenpositionResolver;

  @Inject
  protected transient GewaehltCreate gewaehltCreate;

  @Inject
  protected transient PersonenPruefungStarter personenPruefungStarter;

  @Inject
  protected transient ErsatzkandidaturCreate ersatzkandidaturCreate;

  public ListenkandidaturCreate() {
    super();
  }

  @Override
  public void save(Listenkandidatur listenkandidatur) {
    save(listenkandidatur.getWahl(), listenkandidatur.getListe(), listenkandidatur.getGewaehlte(), listenkandidatur, new ArrayList<>(listenkandidatur.getStaatsangehoerigkeitenSorted()));
  }

  public void save(Wahl wahl, Liste liste, List<Gewaehlt> gewaehlte, Listenkandidatur listenkandidatur, List<Staat> staatsangehoerigkeitenSorted) {
    listenkandidatur.setWahl(attach(wahl));

    Liste listeAttached = attach(liste);
    listenkandidatur.setListe(listeAttached);

    updateZulassungDerListeIfApplicable(listeAttached, listenkandidatur);

    listenkandidatur.setStaatsangehoerigkeitenSorted(attachAll(staatsangehoerigkeitenSorted));

    updateListenpositionen(listenkandidatur.getListe(), listenkandidatur);

    super.save(listenkandidatur);

    save(gewaehlte);

    if (listenkandidatur.hasZugeordneteErsatzkandidatur()) {
      ersatzkandidaturCreate.save(listenkandidatur.getZugeordneteErsatzkandidatur());
    }

    personenPruefungStarter.startePersonenPruefung();
  }

  // NOTE: wird für WAS überschrieben
  protected void updateZulassungDerListeIfApplicable(Liste liste, Listenkandidatur listenkandidatur) {
    if (liste.isZugelassen() && !listenkandidatur.isAufStimmzettel()) {
      liste.setWahlvorschlagStatus(liste.getWahlvorschlagStatusInitial());
    }
  }

  protected void updateListenpositionen(Liste liste, Listenkandidatur listenkandidatur) {
    listenkandidaturListenpositionResolver.updateListenpositionen(liste, listenkandidatur);
  }

  private void save(List<Gewaehlt> gewaehlte) {
    for (Gewaehlt gewaehlt : gewaehlte) {
      gewaehltCreate.save(gewaehlt);
    }
  }

  protected Wahl attach(Wahl wahl) {
    return wahlDao.attach(wahl);
  }

  protected Liste attach(Liste liste) {
    return listeDao.attach(liste);
  }

  protected List<Staat> attachAll(List<Staat> staatsangehoerigkeiten) {
    return staatsangehoerigkeiten.stream().map(staatsangehoerigkeit -> staatDao.attach(staatsangehoerigkeit)).collect(Collectors.toList());
  }
}
