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

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

import javax.annotation.Nullable;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;

public class StimmeingabeListenkandidaturStimmenErfassenModel extends AbstractStimmenErfassenModel {

  private final GruppeImGebiet bezugGruppeImGebiet;

  private final Liste bezugListe;

  /**
   * Die unveränderten Stimmen für die ganze Liste (werden auf die Listenkandidaturen verteilt)
   */
  private StimmeingabeListenkandidaturStimmen listenStimmen;

  /**
   * Die Stimmen für die Listenkandidaturen (ohne die listenStimmen)
   */
  private List<StimmeingabeListenkandidaturStimmen> listenkandidaturStimmen = new ArrayList<>();

  /**
   * Spaltensummen von listenkandidaturStimmen
   */
  private List<StimmeingabeListenkandidaturStimmen> listenkandidaturZwischensummen = new ArrayList<>();

  /**
   * Summe der Stimmen für die Listenkandidaturen (ohne die listenStimmen)
   */
  private StimmeingabeListenkandidaturStimmen listenkandidaturStimmenGesamt;

  public StimmeingabeListenkandidaturStimmenErfassenModel(Wahldurchfuehrungsgebiet bezugGebiet, GruppeImGebiet gruppeImGebiet, Liste liste) {
    super(bezugGebiet);

    this.bezugGruppeImGebiet = gruppeImGebiet;
    this.bezugListe = liste;
  }

  public Liste getBezugListe() {
    return bezugListe;
  }

  /**
   * HINT: das Gebiet der GruppeImGebiet ist auf Erfassungsgebiets-Ebene.
   */
  public GruppeImGebiet getBezugGruppeImGebiet() {
    return bezugGruppeImGebiet;
  }

  public List<StimmeingabeListenkandidaturStimmen> getListenkandidaturStimmen() {
    return listenkandidaturStimmen;
  }

  public void setListenkandidaturStimmen(List<StimmeingabeListenkandidaturStimmen> listenkandidaturStimmen) {
    this.listenkandidaturStimmen = listenkandidaturStimmen;
  }

  public List<Stimmeingabe> getStimmeingabenListenkandidaturStimmen() {
    return extractStimmeingaben(getListenkandidaturStimmen());
  }

  public boolean hasStimmeingabenListenkandidaturStimmen() {
    return !getListenkandidaturStimmen().isEmpty();
  }

  public List<StimmeingabeListenkandidaturStimmen> getListenkandidaturZwischensummen() {
    return listenkandidaturZwischensummen;
  }

  public void setListenkandidaturZwischensummen(List<StimmeingabeListenkandidaturStimmen> listenkandidaturZwischensummen) {
    this.listenkandidaturZwischensummen = listenkandidaturZwischensummen;
  }

  public List<Stimmeingabe> getStimmeingabenListenkandidaturZwischensummen() {
    return extractStimmeingaben(getListenkandidaturZwischensummen());
  }

  public StimmeingabeListenkandidaturStimmen getListenkandidaturStimmenGesamt() {
    return listenkandidaturStimmenGesamt;
  }

  public void setListenkandidaturStimmenGesamt(StimmeingabeListenkandidaturStimmen listenkandidaturStimmenGesamt) {
    this.listenkandidaturStimmenGesamt = listenkandidaturStimmenGesamt;
  }

  public boolean hasStimmeingabeListenkandidaturStimmenGesamt() {
    return getListenkandidaturStimmenGesamt() != null;
  }

  @Nullable
  public Stimmeingabe getStimmeingabeListenkandidaturStimmenGesamt() {
    if (hasStimmeingabeListenkandidaturStimmenGesamt()) {
      return getListenkandidaturStimmenGesamt().getStimmeingabe();
    }

    return null;
  }

  @Nullable
  public StimmeingabeListenkandidaturStimmen getListenStimmen() {
    return listenStimmen;
  }

  public void setListenStimmen(StimmeingabeListenkandidaturStimmen listenStimmen) {
    this.listenStimmen = listenStimmen;
  }

  public boolean hasStimmeingabeListenStimmen() {
    return listenStimmen != null;
  }

  @Nullable
  public Stimmeingabe getStimmeingabeListenStimmen() {
    StimmeingabeListenkandidaturStimmen listenStimmen = getListenStimmen();

    if (listenStimmen != null) {
      return listenStimmen.getStimmeingabe();
    }

    return null;
  }

  @Override
  public Collection<StimmeingabeListenkandidaturStimmen> getAllStimmeingabeValueObjects() {
    Collection<StimmeingabeListenkandidaturStimmen> result = new ArrayList<>();

    result.addAll(getListenkandidaturStimmen());
    result.addAll(getListenkandidaturZwischensummen());

    if (hasStimmeingabeListenkandidaturStimmenGesamt()) {
      result.add(getListenkandidaturStimmenGesamt());
    }

    if (hasStimmeingabeListenStimmen()) {
      result.add(getListenStimmen());
    }

    return result;
  }
}
