
package de.ivu.elect.dokumente.stimmeingabe;

import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;

import de.ivu.document.generator.template.annotations.DocumentSimpleField;

// Cf. ReferendumOptionMitStimmergebnissenDocument!!!
public class ReferendumOptionStimmenDocument extends AbstractStimmenDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("ReferendumOption-Label")
  public String referendumOptionLabel;

  @DocumentSimpleField("ReferendumOption-Kurzbezeichnung")
  public String referendumOptionKurzbezeichnung;

  @DocumentSimpleField("Stimmen-Gueltig")
  public Long anzahlStimmen;

  public ReferendumOptionStimmenDocument(boolean eingabenAnzahlenStimmenExcluded) {
    super(eingabenAnzahlenStimmenExcluded);
  }

  public void addToDocumentKumuliert(StimmeingabeDocumentContext context, CoreStimmeingabeDocumentBuilder stimmeingabeDocumentBuilder,
      ReferendumOptionStimmenDocument referendumOptionStimmenDocument) {
    super.addToDocumentKumuliert(context, stimmeingabeDocumentBuilder, referendumOptionStimmenDocument);

    referendumOptionStimmenDocument.referendumOptionLabel = referendumOptionLabel;
    referendumOptionStimmenDocument.referendumOptionKurzbezeichnung = referendumOptionKurzbezeichnung;
    referendumOptionStimmenDocument.anzahlStimmen = aggregate(referendumOptionStimmenDocument.anzahlStimmen, anzahlStimmen);
  }

  public static List<ReferendumOptionStimmenDocument> aggregate(StimmeingabeDocumentContext context, CoreStimmeingabeDocumentBuilder stimmeingabeDocumentBuilder,
      List<ReferendumOptionStimmenDocument> targets, List<ReferendumOptionStimmenDocument> sources) {
    SortedMap<Object, ReferendumOptionStimmenDocument> targetPerKey = collectStimmenDocumentToAggregatePerTk(targets);

    for (ReferendumOptionStimmenDocument source : sources) {
      Object tk = source.getTk();

      if (tk != null) {
        targetPerKey.putIfAbsent(tk, stimmeingabeDocumentBuilder.createReferendumOptionStimmenDocument(context));
        source.addToDocumentKumuliert(context, stimmeingabeDocumentBuilder, targetPerKey.get(tk));
      }
    }

    return new ArrayList<>(targetPerKey.values());
  }
}
