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

import java.util.Date;
import java.util.HashSet;
import java.util.Map;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gebietsbaum.entity.WahldurchfuehrungsgebietTK;
import de.ivu.elect.business.replikation.boundary.ReplikationErzeugen;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungDAO;
import de.ivu.elect.business.wahlbeteiligung.entity.Wahlbeteiligung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungStatus;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungTyp;

@Stateless
public class WahlbeteiligungAuswertungCreate extends AbstractWahlbeteiligungAuswertungCreate {

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient ReplikationErzeugen replikationErzeugen;

  @Inject
  private transient WahlbeteiligungDAO wahlbeteiligungDAO;

  @Inject
  private transient WahldurchfuehrungsgebietDAO wahldurchfuehrungsgebietDAO;

  @Override
  public void save(WahlbeteiligungAuswertung entity) {

    if (replikationErzeugen.isReplikationNotwendig()) {
      replikationErzeugen.replikationWahlbeteiligungAuswertungCreate(entity);
    }

    HashSet<Wahlbeteiligung> wahlbeteiligungs = new HashSet<>(entity.getWahlbeteiligungsByWahlbeteiligungAuswertung());
    entity.removeAllWahlbeteiligungByWahlbeteiligungAuswertungs();
    Wahl wahl = wahlDAO.attach(entity.getWahl());
    entity.setWahl(wahl);

    super.save(entity);

    if (!wahlbeteiligungs.isEmpty()) {

      Map<WahldurchfuehrungsgebietTK, Wahldurchfuehrungsgebiet> wahldurchfuehrungsgebietTKWahldurchfuehrungsgebietMap = WahldurchfuehrungsgebietTK
          .mappeWahldurchfuehrungsgebietNachTK(wahldurchfuehrungsgebietDAO.findByWahl(wahl));

      for (Wahlbeteiligung wahlbeteiligung : wahlbeteiligungs) {
        wahlbeteiligung.setWahlbeteiligungAuswertung(entity);
        wahlbeteiligung.setWahldurchfuehrungsgebiet(
            wahldurchfuehrungsgebietTKWahldurchfuehrungsgebietMap.get(wahlbeteiligung.getWahldurchfuehrungsgebiet().getWahldurchfuehrungsgebietTK()));
        wahlbeteiligungDAO.persist(wahlbeteiligung);
      }
    }

  }

  public void createManuelleAuswertungAmWahltag(Wahl wahl, int stunden, int minuten) {
    createAuswertungAmWahltag(wahl, stunden, minuten, WahlbeteiligungAuswertungTyp.MANUELL_ZU_ERFASSEN, WahlbeteiligungAuswertungStatus.EINGABE_MOEGLICH);
  }

  public void createAutomatischeAuswertungAmWahltag(Wahl wahl, int stunden, int minuten) {
    createAuswertungAmWahltag(wahl, stunden, minuten, WahlbeteiligungAuswertungTyp.AUTOMATISCH, WahlbeteiligungAuswertungStatus.AUTOMATISCHE_UEBERNAHME_VORGESEHEN);
  }

  private void createAuswertungAmWahltag(Wahl wahl, int stunden, int minuten, WahlbeteiligungAuswertungTyp typ, WahlbeteiligungAuswertungStatus status) {

    // d'oh Date wahltag = (Date) wahl.getWahldatum().clone();
    Date wahltag = new Date(wahl.getWahldatum().getTime());

    // Schön deprecated Methoden...großes Kino @FIXME
    wahltag.setHours(stunden);
    wahltag.setMinutes(minuten);
    wahltag.setSeconds(0);

    WahlbeteiligungAuswertung auswertung = new WahlbeteiligungAuswertung();
    auswertung.setDatum(wahltag);
    auswertung.setWahl(wahl);
    auswertung.setTyp(typ);
    auswertung.setStatus(status);

    // ELECT-6749 direkt speichern, keine Replikation
    auswertung.setWahl(wahlDAO.attach(auswertung.getWahl()));
    super.save(auswertung);

  }
}
