
package de.ivu.elect.business.stimmeingabe.entity;

import static java.util.stream.Collectors.joining;
import static org.apache.commons.lang3.StringUtils.defaultIfBlank;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import javax.annotation.Nullable;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.jee.presentation.dynamicform.AbstractStringProperty;

public class StimmeingabeGruppeStimmenListenstimmenAbzuziehen extends StimmeingabeGruppeStimmen {

  private static final long serialVersionUID = 1L;

  private final Stimmeingabe stimmeingabeListenstimmeAbzuziehen;

  private final Collection<Stimmeingabefehler> stimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang;

  private final List<Stimmeingabefehler> stimmeingabefehlerLetzterErgebniseingang;

  private final Set<String> stimmeingabeListenstimmeAbzuziehenStyleClasses;

  public StimmeingabeGruppeStimmenListenstimmenAbzuziehen(StimmeingabeGruppeStimmen stimmeingabeGruppeStimmen, @Nullable Stimmeingabe stimmeingabeListenstimmeAbzuziehen,
      Collection<Stimmeingabefehler> stimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang) {
    super(stimmeingabeGruppeStimmen);

    this.stimmeingabeListenstimmeAbzuziehen = stimmeingabeListenstimmeAbzuziehen;

    this.stimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang = stimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang;

    this.stimmeingabefehlerLetzterErgebniseingang = new ArrayList<>(stimmeingabeGruppeStimmen.getStimmeingabefehlerLetzterErgebniseingang());
    this.stimmeingabefehlerLetzterErgebniseingang.addAll(stimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang);

    this.stimmeingabeListenstimmeAbzuziehenStyleClasses = new HashSet<>();
  }

  @Override
  public Collection<Stimmeingabe> getStimmeingaben() {
    Collection<Stimmeingabe> result = new ArrayList<>(super.getStimmeingaben());

    if (hasStimmeingabeListenstimmeAbzuziehen()) {
      result.add(getStimmeingabeListenstimmeAbzuziehen());
    }

    return result;
  }

  @Override
  public List<Stimmeingabefehler> getStimmeingabefehlerLetzterErgebniseingang() {
    return stimmeingabefehlerLetzterErgebniseingang;
  }

  @Override
  public void addStimmeingabeStyleClass(Stimmeingabe stimmeingabe, String styleClass) {
    super.addStimmeingabeStyleClass(stimmeingabe, styleClass);

    if (stimmeingabe != null && Objects.equals(stimmeingabe, getStimmeingabeListenstimmeAbzuziehen())) {
      addStimmeingabeListenstimmeAbzuziehenStyleClass(styleClass);
    }
  }

  public boolean isAnzahlEingabeListenstimmeAbzuziehenRendered() {
    return hasStimmeingabeListenstimmeAbzuziehen();
  }

  public boolean hasStimmeingabeListenstimmeAbzuziehen() {
    return getStimmeingabeListenstimmeAbzuziehen() != null;
  }

  public String getAnzahlEingabeListenstimmeAbzuziehenOrDefault(String defaultValue) {
    if (hasStimmeingabeListenstimmeAbzuziehen()) {
      return defaultIfBlank(getAnzahlEingabeListenstimmeAbzuziehen(), defaultValue);
    }

    return "";
  }

  public Stimmeingabe getStimmeingabeListenstimmeAbzuziehen() {
    return stimmeingabeListenstimmeAbzuziehen;
  }

  public String getStimmeingabeListenstimmeAbzuziehenStyleClass() {
    return getStimmeingabeStyleClass(getStimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang()) + " "
        + stimmeingabeListenstimmeAbzuziehenStyleClasses.stream().filter(StringUtils::isNotBlank).collect(joining(" ")) + " ";
  }

  public void addStimmeingabeListenstimmeAbzuziehenStyleClass(String styleClass) {
    stimmeingabeListenstimmeAbzuziehenStyleClasses.add(styleClass);
  }

  public boolean hasAnzahlListenstimmeAbzuziehen() {
    return hasStimmeingabeListenstimmeAbzuziehen() && getStimmeingabeListenstimmeAbzuziehen().hasAnzahlGroesserGleichNull();
  }

  public Long getAnzahlListenstimmeAbzuziehen() {
    return getStimmeingabeListenstimmeAbzuziehen().getAnzahl();
  }

  public void setAnzahlEingabeListenstimmeAbzuziehen(String value) {
    getStimmeingabeListenstimmeAbzuziehenAnzahlEingabeProperty().setValue(value);
  }

  public String getAnzahlEingabeListenstimmeAbzuziehen() {
    return getStimmeingabeListenstimmeAbzuziehenAnzahlEingabeProperty().getValue();
  }

  private AbstractStringProperty getStimmeingabeListenstimmeAbzuziehenAnzahlEingabeProperty() {
    return getStimmeingabeListenstimmeAbzuziehen().getProperties().getAnzahlEingabeProperty();
  }

  public boolean hasMussStimmeingabefehlerListenstimmeAbzuziehen() {
    return containsMussStimmeingabefehler(getStimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang());
  }

  private Collection<Stimmeingabefehler> getStimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang() {
    return stimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang;
  }

  public boolean hasKannStimmeingabefehlerListenstimmeAbzuziehen() {
    return containsKannStimmeingabefehler(getStimmeingabefehlerListenstimmeAbzuziehenLetzterErgebniseingang());
  }
}
