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

import java.util.Map;

import javax.annotation.Nullable;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;

public abstract class AbstractAWerteAktualisierer<G extends Gebiet> {

  @Nullable
  protected Long getAWertKumuliert(G wahldurchfuehrungsgebiet, Map<G, Long> aWertNachErfassungsgebietMap) {

    Long result = aWertNachErfassungsgebietMap.get(wahldurchfuehrungsgebiet);

    if (result == null) {
      for (Map.Entry<G, Long> entry : aWertNachErfassungsgebietMap.entrySet()) {
        G key = entry.getKey();
        Long value = entry.getValue();
        if (isErfassungsgebiet(key) && key.isInGebietshierarchieUntergeordnetesGebietVon(wahldurchfuehrungsgebiet) && value != null) {
          if (result == null) {
            result = value;
          } else {
            result += value;
          }
        }
      }
    }

    return result;
  }

  protected abstract boolean isErfassungsgebiet(G gebiet);

  public abstract boolean isAWerteAktualisieren(G gebiet);

  public abstract void aWerteZuruecksetzen(G gebiet);

}
