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

import static java.util.Arrays.asList;

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;

@Stateless
public class GebietAuswahlbezirkAktualisierer extends AbstractGebietsbaumImportAktualisierer implements GebietsbaumImportAktualisierer {

  public GebietAuswahlbezirkAktualisierer() {
    super();
  }

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

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

  @Override
  protected void aktualisiereGebiete(GebietsbaumExchangeContext context, Map<String, List<Gebiet>> gebieteInDbPerNummer, List<Gebiet> gebieteExternImportiert) {
    // Alle Schalter auf Standardwert zurücksetzen!
    gebieteInDbPerNummer.values().forEach(gebieteInDb -> gebieteInDb.forEach(gebietInDb -> resetGebietInDb(context, attach(gebietInDb))));

    for (Gebiet gebietExtern : gebieteExternImportiert) {
      filterGebieteByNummerAndGebietsart(gebieteInDbPerNummer, gebietExtern).forEach(gebietInDb -> updateGebietInDb(context, attach(gebietInDb), gebietExtern));
    }
  }

  protected void resetGebietInDb(GebietsbaumExchangeContext context, Gebiet gebietInDb) {
    gebietInDb.setAuswahlbezirk(false);
  }

  protected void updateGebietInDb(GebietsbaumExchangeContext context, Gebiet gebietInDb, Gebiet gebietExtern) {
    gebietInDb.setAuswahlbezirk(gebietExtern.getAuswahlbezirk());
  }
}
