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

import java.io.Serializable;
import java.util.List;

import javax.annotation.Nullable;

import org.apache.commons.lang3.StringUtils;

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;

public abstract class AbstractStimmzettelKopfdatumValidator implements Serializable {

  private static final long serialVersionUID = 1L;

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

  @Nullable
  protected String getValue(StimmzettelKopfdatumArt art, @Nullable Gruppe gruppe, List<StimmzettelKopfdatum> stimmzettelKopfdaten) {
    return stimmzettelKopfdaten.stream()
        .filter(stimmzettelKopfdatum -> art.equals(stimmzettelKopfdatum.getStimmzettelKopfdatumArt()))
        .filter(stimmzettelKopfdatum -> (gruppe == null && stimmzettelKopfdatum.getGruppe() == null) || (gruppe != null && gruppe
            .equals(stimmzettelKopfdatum.getGruppe())))
        .findFirst()
        .map(StimmzettelKopfdatum::getWert)
        .orElse(null);
  }

  @Nullable
  protected String getValue(StimmzettelKopfdatumArt art, List<StimmzettelKopfdatum> stimmzettelKopfdaten) {
    return getValue(art, null, stimmzettelKopfdaten);
  }

  @Nullable
  protected Long getLongValue(StimmzettelKopfdatumArt art, @Nullable Gruppe gruppe, List<StimmzettelKopfdatum> stimmzettelKopfdaten) {
    String valueAsString = getValue(art, gruppe, stimmzettelKopfdaten);
    if (StringUtils.isBlank(valueAsString)) {
      return null;
    }

    return parseLong(valueAsString);
  }

  @Nullable
  protected static Long parseLong(String valueAsString) {
    try {
      return Long.parseLong(valueAsString);
    } catch (Exception e) {
      // ignore
    }
    return null;
  }

  @Nullable
  protected Long getLongValue(StimmzettelKopfdatumArt art, List<StimmzettelKopfdatum> stimmzettelKopfdaten) {
    return getLongValue(art, null, stimmzettelKopfdaten);
  }

}
