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

import java.util.ArrayList;
import java.util.Collection;

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.Gebietsgruppierung;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

public class GebietsgruppierungCreate extends AbstractGebietsgruppierungCreate {

  @Inject
  private transient WahlterminDAO wahlterminDAO;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient GebietDAO gebietDAO;

  public GebietsgruppierungCreate() {
    super();
  }

  @Override
  @Deprecated // ELECT-4674 nicht verwenden
  public void save(Gebietsgruppierung gebietsgruppierung) {
    Collection<Gebiet> gebieteZugeordnet = new ArrayList<>(gebietsgruppierung.getGebiete());

    save(gebietsgruppierung, gebieteZugeordnet);
  }

  public void save(Gebietsgruppierung gebietsgruppierung, Collection<Gebiet> gebieteZugeordnet) {
    Wahl wahl = attach(gebietsgruppierung.getWahl());
    Wahltermin wahltermin = attach(gebietsgruppierung.getWahltermin());

    if (wahltermin == null && wahl != null) {
      wahltermin = wahl.getWahltermin();
    }

    gebietsgruppierung.setWahltermin(wahltermin);
    gebietsgruppierung.setWahl(wahl);

    gebietsgruppierung.removeAllGebiets();

    for (Gebiet gebiet : gebieteZugeordnet) {
      gebietsgruppierung.addGebiet(attach(gebiet));
    }

    super.save(gebietsgruppierung);
  }

  private Wahltermin attach(Wahltermin wahltermin) {
    return wahlterminDAO.attach(wahltermin);
  }

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

  private Gebiet attach(Gebiet gebiet) {
    return gebietDAO.attach(gebiet);
  }
}
