
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.entity.Direktkandidatur;
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.DirektkandidatDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;

public class DirektkandidaturCreate extends AbstractDirektkandidaturCreate {

  @Inject
  protected WahlDAO wahlDao;

  @Inject
  protected StaatDAO staatDao;

  @Inject
  protected DirektkandidatDAO direktkandidatDao;

  @Inject
  protected GewaehltCreate gewaehltCreate;

  @Inject
  protected PersonenPruefungStarter personenPruefungStarter;

  @Inject
  protected ErsatzkandidaturCreate ersatzkandidaturCreate;

  public DirektkandidaturCreate() {
    super();
  }

  @Override
  public void save(Direktkandidatur direktkandidatur) {
    save(direktkandidatur.getWahl(), direktkandidatur.getDirektkandidat(), direktkandidatur.getGewaehlte(), direktkandidatur,
        new ArrayList<>(direktkandidatur.getStaatsangehoerigkeitenSorted()));
  }

  public void save(Wahl wahl, Direktkandidat direktkandidat, List<Gewaehlt> gewaehlte, Direktkandidatur direktkandidatur,
      List<Staat> staatsangehoerigkeitenSorted) {
    direktkandidatur.setWahl(attach(wahl));
    direktkandidatur.setDirektkandidat(attach(direktkandidat));
    direktkandidatur.setStaatsangehoerigkeitenSorted(attachAll(staatsangehoerigkeitenSorted));

    super.save(direktkandidatur);

    save(gewaehlte);

    if (direktkandidatur.getZugeordneteErsatzkandidatur() != null) {
      ersatzkandidaturCreate.save(direktkandidatur.getZugeordneteErsatzkandidatur());
    }

    personenPruefungStarter.startePersonenPruefung();
  }

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

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

  private Direktkandidat attach(Direktkandidat direktkandidat) {
    return direktkandidatDao.attach(direktkandidat);
  }

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