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

import java.util.Collections;
import java.util.List;
import java.util.Map;

import javax.ejb.Stateless;

import de.ivu.elect.business.gebietsbaum.boundary.AbstractGebietsbaumImportAktualisierer;
import de.ivu.elect.business.gebietsbaum.boundary.GebietImportAktualisierenArt;
import de.ivu.elect.business.gebietsbaum.boundary.GebietsbaumImportAktualisierer;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class SitzeStimmenGebietAktualisierer extends AbstractGebietsbaumImportAktualisierer
    implements
    GebietsbaumImportAktualisierer {

  public SitzeStimmenGebietAktualisierer() {
    super();
  }

  @Override
  public GebietImportAktualisierenArt getAktualisierungsart() {
    return GebietImportAktualisierenArt.SITZE_UND_STIMMEN_AKTUALISIEREN;
  }

  @Override
  public void validiere(Violations violations, GebietsbaumExchangeContext context, List<Gebiet> gebieteExternImportiert) {
    for (Gebiet gebietExtern : gebieteExternImportiert) {
      validiereGebietInDbExists(violations, context, gebietExtern, Collections.emptyList());
    }
  }

  @Override
  protected void aktualisiereGebiete(GebietsbaumExchangeContext context, Map<String, List<Gebiet>> gebieteInDbPerNummer,
                                     List<Gebiet> gebieteExternImportiert) {
    for (Gebiet gebietExtern : gebieteExternImportiert) {
      List<Gebiet> gebietInDb = filterGebieteByNummerAndGebietsart(gebieteInDbPerNummer, gebietExtern);

      if (gebietInDb.size() != 1) {
        throw new IllegalStateException("Zur Gebietsart " + gebietExtern.getGebietsart().getName() + " und Gebietsnummer "
            + gebietExtern.getNummer() + " wurd kein eindeutiges Gebiet in der DB gefunden!");
      }

      if (gebietExtern.getAnzahlSitze() != null) {
        gebietInDb.get(0).setAnzahlSitze(gebietExtern.getAnzahlSitze());
      }
      if (gebietExtern.getAnzahlStimmenProWaehler() != null) {
        gebietInDb.get(0).setAnzahlStimmenProWaehler(gebietExtern.getAnzahlStimmenProWaehler());
      }
    }
  }
}
