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

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

public class DHondtSitzverteilung implements ZuteilungInVerteilung {

  private int sitze;
  private int sitzeRest;
  private int sitzeGesamtZuVerteilen;
  private AllgemeineListe verteilungInnerhalbVon;
  private AllgemeineListe verteilungAn;
  private VerteilungTyp verteilungTyp;
  private List<DHondtQuotient> dHondtQuotienten;

  public DHondtSitzverteilung() {
  }

  public DHondtSitzverteilung(int sitze, int sitzeRest, int sitzeGesamtZuVerteilen,
                              AllgemeineListe verteilungInnerhalbVon,
                              AllgemeineListe verteilungAn, VerteilungTyp verteilungTyp,
                              List<DHondtQuotient> dHondtQuotienten) {
    this.sitze = sitze;
    this.sitzeRest = sitzeRest;
    this.sitzeGesamtZuVerteilen = sitzeGesamtZuVerteilen;
    this.verteilungInnerhalbVon = verteilungInnerhalbVon;
    this.verteilungAn = verteilungAn;
    this.verteilungTyp = verteilungTyp;
    this.dHondtQuotienten = dHondtQuotienten;
  }

  public int getSitze() {
    return sitze;
  }

  public void setSitze(int sitze) {
    this.sitze = sitze;
  }

  public int getSitzeRest() {
    return sitzeRest;
  }

  public void setSitzeRest(int sitzeRest) {
    this.sitzeRest = sitzeRest;
  }


  /**
   * Berücksichtigt nicht die zuvor verteilten Sitzen aus erster Verteilung oder Hare-Niemeyer-Verteilung.
   * Der Wert wird redundant in allen DHondtSitzverteilung-Objekten der jeweiligen Verteilung gespeichert.
   *
   * @return die Anzahl Restsitze, die noch per d'Hondt zu verteilen sind.
   */
  public int getSitzeGesamtZuVerteilen() {
    return sitzeGesamtZuVerteilen;
  }

  public void setSitzeGesamtZuVerteilen(int sitzeGesamtZuVerteilen) {
    this.sitzeGesamtZuVerteilen = sitzeGesamtZuVerteilen;
  }

  @Override
  public AllgemeineListe getVerteilungInnerhalbVon() {
    return verteilungInnerhalbVon;
  }

  public void setVerteilungInnerhalbVon(AllgemeineListe verteilungInnerhalbVon) {
    this.verteilungInnerhalbVon = verteilungInnerhalbVon;
  }

  @Override
  public AllgemeineListe getVerteilungAn() {
    return verteilungAn;
  }

  public void setVerteilungAn(AllgemeineListe verteilungAn) {
    this.verteilungAn = verteilungAn;
  }

  @Override
  public VerteilungTyp getVerteilungTyp() {
    return verteilungTyp;
  }

  public void setVerteilungTyp(VerteilungTyp verteilungTyp) {
    this.verteilungTyp = verteilungTyp;
  }

  public List<DHondtQuotient> getDHondtQuotienten() {
    return dHondtQuotienten;
  }

  public void setDHondtQuotienten(List<DHondtQuotient> dHondtQuotienten) {
    this.dHondtQuotienten = dHondtQuotienten;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    DHondtSitzverteilung that = (DHondtSitzverteilung) o;
    return sitze == that.sitze &&
            sitzeRest == that.sitzeRest &&
            sitzeGesamtZuVerteilen == that.sitzeGesamtZuVerteilen &&
            Objects.equals(verteilungInnerhalbVon, that.verteilungInnerhalbVon) &&
            Objects.equals(verteilungAn, that.verteilungAn) &&
            verteilungTyp == that.verteilungTyp &&
            Objects.equals(dHondtQuotienten, that.dHondtQuotienten);
  }

  @Override
  public int hashCode() {
    return Objects.hash(sitze, sitzeRest, sitzeGesamtZuVerteilen, verteilungInnerhalbVon, verteilungAn, verteilungTyp,
            dHondtQuotienten);
  }

  @Override
  public String toString() {
    return "DHondtSitzverteilung{" +
            "sitze=" + sitze +
            ", sitzeRest=" + sitzeRest +
            ", sitzeGesamtZuVerteilen=" + sitzeGesamtZuVerteilen +
            ", verteilungInnerhalbVon=" + verteilungInnerhalbVon +
            ", verteilungAn=" + verteilungAn +
            ", verteilungTyp=" + verteilungTyp +
            ", dHondtQuotienten=" + dHondtQuotienten +
            '}';
  }
}
