
package de.ivu.elect.presentation.verteilung;

import static java.util.stream.Collectors.joining;

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

import de.ivu.elect.business.verteilung.boundary.VerteilungContext;
import de.ivu.elect.business.verteilung.boundary.VerteilungTeilnehmer;
import de.ivu.elect.business.verteilung.boundary.VerteilungTeilnehmerErgebnis;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.presentation.dynamicform.PropertyType;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyLongProperty;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;

public class VerteilungBerechnenViewZusammenfassungResult extends AbstractVerteilungBerechnenViewResult {

  public VerteilungBerechnenViewZusammenfassungResult(VerteilungBerechnenViewContext context, VerteilungBerechnenViewErgebnis ergebnis) {
    super(context, ergebnis);
  }

  public AdvancedDynaFormModel getModel() {
    FormBuilder formBuilder = createResultFormBuilder();

    getErgebnis().ifPresent(ergebnis -> {
      VerteilungContext context = ergebnis.getContext();

      formBuilder.addProperty(new ReadOnlyStringProperty(context.getMessage("verteilung.berechnen.ergebnis.summary.VerteilungAlgorithmus"), ergebnis.getAlgorithmus().formatBeschreibung(context)));

      ergebnis.getException().ifPresent(exception -> {
        Property exceptionProperty = new ReadOnlyStringProperty(context.getMessage("verteilung.berechnen.ergebnis.summary.Exception"),
            collectRawCauses(new ArrayList<>(), exception).stream().collect(joining(System.lineSeparator())));

        formBuilder.addProperty(exceptionProperty).withType(PropertyType.INPUT_TEXTAREA);
      });

      if (!ergebnis.collectTeilnehmerErgebnisse().isEmpty()) {
        formBuilder.addProperty(new ReadOnlyStringProperty(context.getMessage("verteilung.berechnen.ergebnis.summary.AnzahlSitzeVerteilt"),
            context.getMessage("verteilung.berechnen.ergebnis.summary.AnzahlSitzeVerteilt.value", ergebnis.getAnzahlSitzeVerteilt(), ergebnis.getAnzahlSitzeVerteiltVorab(),
                ergebnis.getAnzahlSitzeVerteiltInVerteilung())));
        formBuilder.addProperty(new ReadOnlyLongProperty(context.getMessage("verteilung.berechnen.ergebnis.summary.AnzahlStimmen"), ergebnis.getAnzahlStimmen()));

        ergebnis.getZuteilungsdivisor().ifPresent(zuteilungsdivisor -> formBuilder
            .addProperty(new ReadOnlyStringProperty(context.getMessage("verteilung.berechnen.ergebnis.summary.Zuteilungsdivisor"), zuteilungsdivisor.formatDezimal(context))));

        ergebnis.findTeilnehmerErgebnisTeilnehmerIsInMehrheitssicherung().ifPresent(teilnehmerErgebnisTeilnehmerIsInMehrheitssicherung -> formBuilder.addProperty(new ReadOnlyStringProperty(
            context.getMessage("verteilung.berechnen.ergebnis.summary.TeilnehmerIsInMehrheitssicherung"), teilnehmerErgebnisTeilnehmerIsInMehrheitssicherung.getTeilnehmer().getLabel())));

        List<VerteilungTeilnehmerErgebnis> teilnehmerErgebnisseTeilnehmerIsInLosverfahren = ergebnis.collectTeilnehmerErgebnisseTeilnehmerIsInLosverfahren();

        if (!teilnehmerErgebnisseTeilnehmerIsInLosverfahren.isEmpty()) {
          formBuilder
              .addProperty(new ReadOnlyLongProperty(context.getMessage("verteilung.berechnen.ergebnis.summary.AnzahlSitzeVerteiltInLosverfahren"), ergebnis.getAnzahlSitzeVerteiltInLosverfahren()));

          formBuilder.addProperty(new ReadOnlyStringProperty(context.getMessage("verteilung.berechnen.ergebnis.summary.TeilnehmerIsInLosverfahren"),
              teilnehmerErgebnisseTeilnehmerIsInLosverfahren.stream().map(VerteilungTeilnehmerErgebnis::getTeilnehmer).map(VerteilungTeilnehmer::getLabel).collect(joining(", "))));
        }
      }
    });

    return formBuilder.createModel();
  }
}
