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

import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.stimmzettel.entity.Stimmzettel;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelErfassungValidationEntry;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelKopfdatum;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelKopfdatumArt;

import javax.annotation.Nullable;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StimmzettelInsgesamtAnzahlKopdatumValidator extends AbstractStimmzettelKopfdatumValidator {
  private static final long serialVersionUID = 1L;

  @Override
  public StimmzettelErfassungValidationEntry validiere(StimmzettelKopfdatumArt art, @Nullable Gruppe gruppe, List<StimmzettelKopfdatum> stimmzettelKopfdaten, List<Stimmzettel> stimmzettelList) {

    Long stimmzettelEingenommen = getLongValue(art, stimmzettelKopfdaten);
    if (stimmzettelEingenommen == null) {
      return StimmzettelErfassungValidationEntry.SUCCESS;
    }

    Long ungueltigeNichtGekennzeichnet = getLongValue(StimmzettelKopfdatumArt.ANZAHL_STIMMZETTEL_UNGUELTIG_NICHT_GEKENNZEICHNET, stimmzettelKopfdaten);
    if (ungueltigeNichtGekennzeichnet == null) {
      ungueltigeNichtGekennzeichnet = 0L;
    }
    Map<StimmzettelKopfdatumArt, List<StimmzettelKopfdatum>> kopfdatenNachArt = stimmzettelKopfdaten.stream().collect(Collectors.groupingBy(StimmzettelKopfdatum::getStimmzettelKopfdatumArt));
    Long unveraendertGekennzeichnetGesamt = parseStringLong(StimmzettelKopfdatumArt.ANZAHL_STIMMZETTEL_UNVERAENDERT/*berechnet*/.berechneWert(kopfdatenNachArt, stimmzettelList));
    if (unveraendertGekennzeichnetGesamt == null) {
      unveraendertGekennzeichnetGesamt = 0L;
    }

    long anzahlErfassteStimmzettel = stimmzettelList.size();

    if (stimmzettelEingenommen < (ungueltigeNichtGekennzeichnet + unveraendertGekennzeichnetGesamt + anzahlErfassteStimmzettel)) {
      return StimmzettelErfassungValidationEntry
              .createError("wes.stimmzettel.validator.stimmzettel.gesamt.kleiner.erfasst", stimmzettelEingenommen, ungueltigeNichtGekennzeichnet,
                      unveraendertGekennzeichnetGesamt, anzahlErfassteStimmzettel);
    }

    return StimmzettelErfassungValidationEntry.SUCCESS;
  }

  private Long parseStringLong(String berechneWert) {
    if (berechneWert == null) {
      return null;
    }
    try {
      return Long.parseLong(berechneWert);
    } catch (Exception e) {
      return 0L;
    }
  }
}
