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

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 javax.ejb.Stateless;
import java.util.List;
import java.util.Map;

@Stateless
public class CoreGebietVerantwortlicherEmpfaengerAktualisierer extends AbstractGebietsbaumImportAktualisierer
    implements
    GebietsbaumImportAktualisierer {

  public CoreGebietVerantwortlicherEmpfaengerAktualisierer() {
    super();
  }

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

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

  @Override
  protected void aktualisiereGebiete(GebietsbaumExchangeContext context, Map<String, List<Gebiet>> gebieteInDbPerNummer,
                                     List<Gebiet> gebieteExternImportiert) {
    for (var gebietExtern : gebieteExternImportiert) {
      var 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).setVerantwortlicherEmpfaenger(gebietExtern.getVerantwortlicherEmpfaenger());
    }
  }
}
