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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.dokumente.control.DokumentExtraFileOutput;
import de.ivu.elect.business.ergebnis.boundary.GesamtErgebnisDokumentContext;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.control.GebietByBreadthFirstComparator;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;

@Specializes // ELECT-10670
public class NlDefaultGesamtErgebnisDokumentKonverter extends DefaultGesamtErgebnisDokumentKonverter {

  public NlDefaultGesamtErgebnisDokumentKonverter() {
    super();
  }

  @Override
  protected Object konvertiere(Ergebnis ergebnis, GesamtErgebnisDokumentContext context, DokumentExtraFileOutput dokumentExtraFileOutput) {
    String dokumentKey = createContextParameterKey(context);

    if (context.containsKey(dokumentKey)) {
      GesamtErgebnisDokument dokument = context.get(dokumentKey, GesamtErgebnisDokument.class);

      if (dokument != null) {
        info("Verwende GECACHTES Dokument [" //
            + "dokumentKey = " + dokumentKey + ", " //
            + "dokument = " + dokument //
            + "]");

        return dokument;
      }
    }

    Object dokument = super.konvertiere(ergebnis, context, dokumentExtraFileOutput);

    context.put(dokumentKey, dokument);

    info("Verwende NEUES Dokument [" //
        + "dokumentKey = " + dokumentKey + ", " //
        + "dokument = " + dokument //
        + "]");

    return dokument;
  }

  private String createContextParameterKey(GesamtErgebnisDokumentContext context) {
    return createContextParameterKey("NlDefaultGesamtErgebnisDokumentKonverter#GesamtErgebnisDokument@", context.getGebiete());
  }

  public static String createContextParameterKey(String parameterKeyPrefix, Collection<Wahldurchfuehrungsgebiet> gebiete) {
    long parameterKeyHash = System.nanoTime();

    if (gebiete != null && !gebiete.isEmpty()) {
      List<Wahldurchfuehrungsgebiet> auswertungsgebiete = new ArrayList<>(gebiete);
      auswertungsgebiete.sort(GebietByBreadthFirstComparator.INSTANCE);

      parameterKeyHash = Arrays.hashCode(auswertungsgebiete.toArray(new Wahldurchfuehrungsgebiet[auswertungsgebiete.size()]));
    }

    return parameterKeyPrefix + parameterKeyHash; // ELECT-13362, eineindeutigen Key per Auswertungsgebiete erzeugen!!!
  }
}
