
package de.ivu.elect.presentation.kandidatur;

import java.io.Serializable;
import java.util.Date;

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietFactory;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.presentation.kandidatur.form.KandidaturViewFormBuilder;
import de.ivu.elect.presentation.wahl.CurrentWahlZulassungspruefungExtended;

public class KandidaturCreateViewHelper implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient GruppeImGebietFactory gruppeImGebietFactory;

  @Inject
  protected transient KandidaturViewFormBuilder kandidaturViewFormBuilder;

  @Inject
  protected transient CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung;

  public KandidaturCreateViewHelper() {
    super();
  }

  public void checkAutoCompleteOptionsExist(Wahl wahl) {
    kandidaturViewFormBuilder.checkAutoCompleteOptionsExist(wahl);
  }

  public void init(Gebiet gebiet, Direktkandidat direktkandidat, Direktkandidatur direktkandidatur) {
    initWahlvorschlag(gebiet, direktkandidat);

    direktkandidatur.setDirektkandidat(direktkandidat);

    initKandidatur(gebiet, direktkandidatur);
  }

  public void initWahlvorschlag(Gebiet gebiet, Wahlvorschlag wahlvorschlag) {
    wahlvorschlag.setGruppeImGebiet(createGruppeImGebiet(gebiet));
    wahlvorschlag.setZeitpunktDerEinreichung(new Date());
  }

  public void initKandidatur(Gebiet gebiet, Kandidatur kandidatur) {
    Wahl wahl = gebiet.getWahl();

    kandidatur.setWahl(wahl);
    kandidatur.addStaatsangehoerigkeit(getDefaultStaatsangehoerigkeit());
    kandidatur.setGewaehltVorperiode(createGewaehltVorperiode(wahl));
    kandidatur.setKandidaturStatus(currentWahlZulassungspruefung.getZulassungKandidaturStatusInitial());
  }

  private GruppeImGebiet createGruppeImGebiet(Gebiet gebiet) {
    GruppeImGebiet gruppeImGebiet = gruppeImGebietFactory.create();
    gruppeImGebiet.setGebiet(gebiet);

    return gruppeImGebiet;
  }

  private Gewaehlt createGewaehltVorperiode(Wahl wahl) {
    return kandidaturViewFormBuilder.createGewaehltVorperiode(wahl);
  }

  protected Staat getDefaultStaatsangehoerigkeit() {
    return kandidaturViewFormBuilder.getDefaultStaatsangehoerigkeit();
  }

  protected void tryAttachStaatsangehoerigkeiten(Personendaten personendaten) {
    kandidaturViewFormBuilder.tryAttachStaatsangehoerigkeiten(personendaten);
  }
}
