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

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

import javax.ejb.Stateless;

import de.ivu.elect.business.gebietsbaum.control.GebietsbaumExchangeContext;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietsartBezirksart;
import de.ivu.elect.jee.exchange.Violations;


import static java.util.Arrays.asList;

@Stateless
public class CoreGebietPruefkennzeichenAktualisierer extends AbstractGebietsbaumImportAktualisierer
    implements
      GebietsbaumImportAktualisierer {

  public CoreGebietPruefkennzeichenAktualisierer() {
    super();
  }

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

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

  @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!");
      }

      gebietInDb.get(0).setExterneId(gebietExtern.getExterneId());
      gebietInDb.get(0).setExterneIdSalt(gebietExtern.getExterneIdSalt());
    }
  }
}
