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

import static java.util.stream.Collectors.toList;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.jee.entity.EntityContainer;
import de.ivu.elect.jee.entity.tk.EntityTK;

public class StimmeingabeReferendumVorlageStimmen extends AbstractStimmeingabeStimmen {

  private static final long serialVersionUID = 1L;

  private final String bezeichnung;

  private final String kennung;

  private final Gruppe gruppe;

  private final List<Stimmeingabefehler> stimmeingabefehlerLetzterErgebniseingang;

  private final List<StimmeingabeReferendumOptionStimmen> stimmeingabeReferendumOptionStimmen;

  public StimmeingabeReferendumVorlageStimmen(String bezeichnung, String kennung, Gruppe gruppe, List<StimmeingabeReferendumOptionStimmen> stimmeingabeReferendumOptionStimmen) {
    super();

    this.bezeichnung = bezeichnung;
    this.kennung = kennung;

    this.gruppe = gruppe;

    this.stimmeingabefehlerLetzterErgebniseingang = stimmeingabeReferendumOptionStimmen.stream().flatMap(x -> x.getStimmeingabefehlerLetzterErgebniseingang().stream()).collect(toList());

    this.stimmeingabeReferendumOptionStimmen = stimmeingabeReferendumOptionStimmen;
  }

  @Override
  public String getBezeichnung() {
    return bezeichnung;
  }

  @Override
  public String getKennung() {
    return kennung;
  }

  @Override
  public Gruppe getGruppe() {
    return gruppe;
  }

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

  public List<StimmeingabeReferendumOptionStimmen> getStimmeingabeReferendumOptionStimmen() {
    return stimmeingabeReferendumOptionStimmen;
  }

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

    for (StimmeingabeStimmen stimmeingabeReferendumVorlageStimmen : getStimmeingabeReferendumOptionStimmen()) {
      result.addAll(stimmeingabeReferendumVorlageStimmen.getStimmeingaben());
    }

    return result;
  }

  @Override
  public boolean hasTk(EntityTK tk) {
    for (StimmeingabeStimmen stimmeingabeReferendumVorlageStimmen : getStimmeingabeReferendumOptionStimmen()) {
      if (stimmeingabeReferendumVorlageStimmen.hasTk(tk)) {
        return true;
      }
    }

    return false;
  }

  @Override
  public boolean isInstanceOf(Class< ? > clazz) {
    return false;
  }

  @Override
  public <E> EntityContainer<E> castTo(Class<E> clazz) {
    throw new UnsupportedOperationException();
  }

  @Override
  public String getBaseClassName() {
    return getClass().getName();
  }
}
