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

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietTK;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungVerlaufGebietDAO;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlauf;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlaufGebiet;

public class WahlbeteiligungVerlaufCreate extends AbstractWahlbeteiligungVerlaufCreate {

  @Inject
  private transient WahlbeteiligungVerlaufGebietDAO wahlbeteiligungVerlaufGebietDAO;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient GebietDAO gebietDAO;

  @Override
  public void save(WahlbeteiligungVerlauf entity) {

    HashSet<WahlbeteiligungVerlaufGebiet> wahlbeteiligungVerlaufGebiets = new HashSet<>(entity.getWahlbeteiligungVerlaufGebietsByWahlbeteiligungVerlauf());
    entity.removeAllWahlbeteiligungVerlaufGebietByWahlbeteiligungVerlaufs();

    Wahl wahl = wahlDAO.attach(entity.getWahl());
    entity.setWahl(wahl);
    super.save(entity);


    Map<GebietTK, WahlbeteiligungVerlaufGebiet> wahlbeteiligungVerlaufGebietNachTk = new HashMap<>();
    for (WahlbeteiligungVerlaufGebiet wahlbeteiligungVerlaufGebiet : wahlbeteiligungVerlaufGebiets) {
      wahlbeteiligungVerlaufGebietNachTk.put(wahlbeteiligungVerlaufGebiet.getGebiet().getGebietTK(), wahlbeteiligungVerlaufGebiet);
    }


    for (Gebiet gebiet : gebietDAO.findByWahl(wahl)) {
      createVerlaufFuerGebiet(entity, gebiet, wahlbeteiligungVerlaufGebietDAO, wahlbeteiligungVerlaufGebietNachTk);
    }

  }

  public static void createVerlaufFuerGebiet(WahlbeteiligungVerlauf entity, Gebiet gebiet, WahlbeteiligungVerlaufGebietDAO wahlbeteiligungVerlaufGebietDAO, Map<GebietTK, WahlbeteiligungVerlaufGebiet> wahlbeteiligungVerlaufGebietNachTk) {
    WahlbeteiligungVerlaufGebiet wahlbeteiligungVerlaufGebiet = wahlbeteiligungVerlaufGebietNachTk.get(gebiet.getGebietTK());
    if (wahlbeteiligungVerlaufGebiet == null) {
      wahlbeteiligungVerlaufGebiet = new WahlbeteiligungVerlaufGebiet();
    }
    wahlbeteiligungVerlaufGebiet.setWahlbeteiligungVerlauf(entity);
    wahlbeteiligungVerlaufGebiet.setGebiet(gebiet);
    wahlbeteiligungVerlaufGebietDAO.persist(wahlbeteiligungVerlaufGebiet);
  }

}
