package de.ivu.elect.sitzberechnung.osv.exchange.p22;


import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class OSVLegacyErgebnisDaten {

  public OSVLegacyErgebnisDaten() {
  }

  public OSVLegacyErgebnisDaten(long anzahlStimmen, long anzahlSitze, long vorzugsschwelleInProzent,
                                boolean mussVorzugsschwelleUebertreffen,
                                List<BesonderheitBeiNominierungDerGewaehlten> besonderheiten,
                                List<Zuteilung> zuteilungen,
                                List<DHondtSitzverteilung> dHondtSitzverteilungen,
                                List<Unterverteilung> unterverteilungen,
                                List<MitVorzugGewaehlteKandidatur> mitVorzugGewaehlteKandidaturen) {
    this.anzahlStimmen = anzahlStimmen;
    this.anzahlSitze = anzahlSitze;
    this.vorzugsschwelleInProzent = vorzugsschwelleInProzent;
    this.mussVorzugsschwelleUebertreffen = mussVorzugsschwelleUebertreffen;
    this.besonderheiten = besonderheiten;
    this.zuteilungen = zuteilungen;
    this.dHondtSitzverteilungen = dHondtSitzverteilungen;
    this.unterverteilungen = unterverteilungen;
    this.mitVorzugGewaehlteKandidaturen = mitVorzugGewaehlteKandidaturen;
  }

  private long anzahlStimmen;
  private long anzahlSitze;
  private long vorzugsschwelleInProzent;
  private boolean mussVorzugsschwelleUebertreffen;

  private List<BesonderheitBeiNominierungDerGewaehlten> besonderheiten = new ArrayList<>();
  private List<Zuteilung> zuteilungen = new ArrayList<>();
  private List<DHondtSitzverteilung> dHondtSitzverteilungen = new ArrayList<>();
  private List<Unterverteilung> unterverteilungen = new ArrayList<>();

  private List<MitVorzugGewaehlteKandidatur> mitVorzugGewaehlteKandidaturen = new ArrayList<>();
  private List<AllgemeineListe> mitGeaenderterReihenfolgeListen = new ArrayList<>();

  public long getAnzahlStimmen() {
    return anzahlStimmen;
  }

  public void setAnzahlStimmen(long anzahlStimmen) {
    this.anzahlStimmen = anzahlStimmen;
  }

  public long getAnzahlSitze() {
    return anzahlSitze;
  }

  public void setAnzahlSitze(long anzahlSitze) {
    this.anzahlSitze = anzahlSitze;
  }

  public long getVorzugsschwelleInProzent() {
    return vorzugsschwelleInProzent;
  }

  public void setVorzugsschwelleInProzent(long vorzugsschwelleInProzent) {
    this.vorzugsschwelleInProzent = vorzugsschwelleInProzent;
  }

  public List<AllgemeineListe> getMitGeaenderterReihenfolgeListen() {
    return mitGeaenderterReihenfolgeListen;
  }

  /**
   * @return true, wenn die Vorzugsschwelle für einen Vorzugssitz übertroffen werden muss, false, wenn es ausreicht, sie
   * zu erreichen.
   */
  public boolean getMussVorzugsschwelleUebertreffen() {
    return mussVorzugsschwelleUebertreffen;
  }

  public void setMussVorzugsschwelleUebertreffen(boolean mussVorzugsschwelleUebertreffen) {
    this.mussVorzugsschwelleUebertreffen = mussVorzugsschwelleUebertreffen;
  }

  public List<BesonderheitBeiNominierungDerGewaehlten> getBesonderheiten() {
    return besonderheiten;
  }

  public void setBesonderheiten(List<BesonderheitBeiNominierungDerGewaehlten> besonderheiten) {
    this.besonderheiten = besonderheiten;
  }

  public List<Zuteilung> getZuteilungen() {
    return zuteilungen;
  }

  public void setZuteilungen(List<Zuteilung> zuteilungen) {
    this.zuteilungen = zuteilungen;
  }

  public List<DHondtSitzverteilung> getDHondtSitzverteilungen() {
    return dHondtSitzverteilungen;
  }

  public void setDHondtSitzverteilungen(List<DHondtSitzverteilung> dHondtSitzverteilungen) {
    this.dHondtSitzverteilungen = dHondtSitzverteilungen;
  }

  public void setUnterverteilungen(List<Unterverteilung> unterverteilungen) {
    this.unterverteilungen = unterverteilungen;
  }

  public List<Unterverteilung> getUnterverteilungen() {
    return unterverteilungen;
  }

  public List<MitVorzugGewaehlteKandidatur> getMitVorzugGewaehlteKandidaturen() {
    return mitVorzugGewaehlteKandidaturen;
  }

  public void setMitVorzugGewaehlteKandidaturen(List<MitVorzugGewaehlteKandidatur> mitVorzugGewaehlteKandidaturen) {
    this.mitVorzugGewaehlteKandidaturen = mitVorzugGewaehlteKandidaturen;
  }

  public void addMitVorzugGewaehlt(String kandidaturKey) {
    this.mitVorzugGewaehlteKandidaturen.add(new MitVorzugGewaehlteKandidatur(kandidaturKey));
  }

  public void addListeMitGeaenderterReihenfolge(AllgemeineListe liste) {
    this.mitGeaenderterReihenfolgeListen.add(liste);
  }

  @Override
  @Deprecated // Wozu?
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    OSVLegacyErgebnisDaten that = (OSVLegacyErgebnisDaten) o;
    return anzahlStimmen == that.anzahlStimmen &&
            anzahlSitze == that.anzahlSitze &&
            vorzugsschwelleInProzent == that.vorzugsschwelleInProzent &&
            mussVorzugsschwelleUebertreffen == that.mussVorzugsschwelleUebertreffen &&
            Objects.equals(besonderheiten, that.besonderheiten) &&
            Objects.equals(zuteilungen, that.zuteilungen) &&
            Objects.equals(dHondtSitzverteilungen, that.dHondtSitzverteilungen) &&
            Objects.equals(unterverteilungen, that.unterverteilungen) &&
            Objects.equals(mitVorzugGewaehlteKandidaturen, that.mitVorzugGewaehlteKandidaturen);
  }

  @Override
  @Deprecated // Wozu?
  public int hashCode() {
    return Objects.hash(anzahlStimmen, anzahlSitze, vorzugsschwelleInProzent, mussVorzugsschwelleUebertreffen,
            besonderheiten, zuteilungen, dHondtSitzverteilungen, unterverteilungen, mitVorzugGewaehlteKandidaturen);
  }

  @Override
  public String toString() {
    return "OSVLegacyErgebnisDaten{" +
            "anzahlStimmen=" + anzahlStimmen +
            ", anzahlSitze=" + anzahlSitze +
            ", vorzugsschwelleInProzent=" + vorzugsschwelleInProzent +
            ", mussVorzugsschwelleUebertreffen=" + mussVorzugsschwelleUebertreffen +
            ", besonderheiten=" + besonderheiten +
            ", zuteilungen=" + zuteilungen +
            ", dHondtSitzverteilungen=" + dHondtSitzverteilungen +
            ", unterverteilungen=" + unterverteilungen +
            ", mitVorzugGewaehlteKandidaturKeys=" + mitVorzugGewaehlteKandidaturen +
            '}';
  }
}
