
package de.ivu.elect.presentation.ergebnis.dokumente.gesamtergebnis.dhondt;

import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.List;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentQueue;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.ergebnis.entity.DHondtQuotient;

public class DHondtTableRow extends BaseDocument {

  private static final long serialVersionUID = 1L;

  public static final Long RANG_GEWONNEN_PLACEHOLDER = null;

  @DocumentSimpleField("Nenner")
  public final Long nenner;

  @DocumentQueue(value = "Quotient", elementClass = BigDecimal.class)
  public final LinkedList<BigDecimal> quotient;

  /**
   * @deprecated
   * @see DHondtTableRow#quotient
   * @see DokumentFormatter#formatBigDecimalKommastellen
   */
  @Deprecated
  @DocumentQueue(value = "Quotient-Zweistellig", elementClass = BigDecimal.class)
  public final LinkedList<BigDecimal> quotientZweiStellig;

  @DocumentQueue(value = "Rang", elementClass = Long.class)
  public final LinkedList<Long> rang;

  @DocumentQueue(value = "RangGewonnen", elementClass = Long.class)
  public final LinkedList<Long> rangGewonnen;

  @DocumentQueue(value = "Sitzgewinn", elementClass = Boolean.class)
  public final LinkedList<Boolean> sitzgewinn;

  @DocumentQueue(value = "TeilnehmerAmLosverfahren", elementClass = Boolean.class)
  public final LinkedList<Boolean> teilnehmerAmLosverfahren;

  public DHondtTableRow(Long nenner, List<DHondtQuotient> dHondtQuotienten) {
    super();

    this.nenner = nenner;

    this.quotient = new LinkedList<>();
    this.quotientZweiStellig = new LinkedList<>();

    this.rang = new LinkedList<>();
    this.rangGewonnen = new LinkedList<>();

    this.sitzgewinn = new LinkedList<>();

    this.teilnehmerAmLosverfahren = new LinkedList<>();

    for (DHondtQuotient dHondtQuotient : dHondtQuotienten) {
      this.quotient.add(dHondtQuotient.getQuotientenwert());
      this.quotientZweiStellig.add(dHondtQuotient.getQuotientenwert(2));

      Long rang = dHondtQuotient.getRang();
      boolean sitzgewinn = Boolean.TRUE.equals(dHondtQuotient.getSitzgewinn());

      this.rang.add(rang);
      this.rangGewonnen.add(sitzgewinn ? rang : RANG_GEWONNEN_PLACEHOLDER); // ELECTKOM-1036

      this.sitzgewinn.add(sitzgewinn);

      this.teilnehmerAmLosverfahren.add(dHondtQuotient.getTeilnehmerAmLosverfahren());
    }
  }
}
