
package de.ivu.elect.dokumente.ergebnis.kandidatur;

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

import de.ivu.elect.business.ergebnis.control.kandidatur.ErgebnisKandidaturenTabellarischDocumentExportContext;
import de.ivu.elect.dokumente.ergebnis.AbstractErgebnisTabellarischDocumentAufteiler;
import de.ivu.elect.util.ListUtil;

public class ErgebnisKandidaturenTabellarischDocumentAufteiler
    extends
      AbstractErgebnisTabellarischDocumentAufteiler<ErgebnisKandidaturenTabellarischDocumentExportContext, ErgebnisKandidaturenTabellarischDocument, ErgebnisKandidaturenTabellarischDocumentZeile> {

  public ErgebnisKandidaturenTabellarischDocumentAufteiler() {
    super();
  }

  @Override
  protected List<ErgebnisKandidaturenTabellarischDocument> createDocumentCopiesHavingMaxAnzahlSpalten(ErgebnisKandidaturenTabellarischDocument template,
      ErgebnisKandidaturenTabellarischDocumentExportContext context) {
    List<ErgebnisKandidaturenTabellarischDocument> result = new ArrayList<>();

    if (!template.zeilen.isEmpty()) {
      ErgebnisKandidaturenTabellarischDocument copy = template;
      List<Integer> anzahlSpaltenJeTeil = berechneAnzahlSpaltenJeDokumentVorlageArten(template, context);

      copy = copy.copy();
      result.add(copy);

      for (int i = 0; i < anzahlSpaltenJeTeil.size() - 1; i++) {
        Integer anzahlSpalten = anzahlSpaltenJeTeil.get(i);

        copy = copy.copy();
        copy.removeAnzahlParteiEintraege(anzahlSpalten);

        result.add(copy);
      }
    }

    return result;
  }

  private List<Integer> berechneAnzahlSpaltenJeDokumentVorlageArten(ErgebnisKandidaturenTabellarischDocument template, ErgebnisKandidaturenTabellarischDocumentExportContext context) {
    return berechneAnzahlSpaltenJeDokumentVorlageArten(extractAnzahlSpalten(template), context.getDokumentVorlageErsteSeiteAnzahlSpalten(), context.getDokumentVorlageWeitereSeitenAnzahlSpalten(),
        context.getDokumentVorlageWeitereSeiten());
  }

  private int extractAnzahlSpalten(ErgebnisKandidaturenTabellarischDocument template) {
    if (template.zeilen.isEmpty()) {
      return template.summenListenkandidatStimmenQueueNummer.size();
    }

    return template.zeilen.get(0).listenkandidatStimmenQueueAnzahlStimmen.size();
  }

  @Override
  protected List<ErgebnisKandidaturenTabellarischDocument> createDocumentCopiesHavingZeilen(ErgebnisKandidaturenTabellarischDocument template,
      List<List<ErgebnisKandidaturenTabellarischDocumentZeile>> zeilenPerDocumentCopy) {
    List<ErgebnisKandidaturenTabellarischDocument> result = new ArrayList<>();

    for (List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilen : zeilenPerDocumentCopy) {
      ErgebnisKandidaturenTabellarischDocument copy = template.copy();

      copy.zeilen.clear();
      copy.zeilen.addAll(zeilen);

      result.add(copy);
    }

    return result;
  }

  @Override
  protected void calculateDocumentsUebertraegeAndSummen(List<ErgebnisKandidaturenTabellarischDocument> documents, List<ErgebnisKandidaturenTabellarischDocumentZeile> alleZeilenInDocuments) {
    calculateSummeAufLetzterSeiteOderDatenAufZwischenseiten(documents, alleZeilenInDocuments);
  }

  private void calculateSummeAufLetzterSeiteOderDatenAufZwischenseiten(List<ErgebnisKandidaturenTabellarischDocument> documents,
      List<ErgebnisKandidaturenTabellarischDocumentZeile> alleZeilenInDocuments) {
    ErgebnisKandidaturenTabellarischDocument lastDocument = ListUtil.lastOrNull(documents);

    for (ErgebnisKandidaturenTabellarischDocument document : documents) {
      if (document.equals(lastDocument)) {
        document.ergebnisSummen.setSummen(alleZeilenInDocuments, document);
      } else {
        document.ergebnisSummen.setMetaData(alleZeilenInDocuments, document);
      }
    }
  }
}
