
package de.ivu.elect.business.ergebniskonflikt.entity;

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

import java.util.Collection;
import java.util.List;

import de.ivu.elect.jee.faces.Messages;

public interface SitzberechnungsalgorithmusOptionenAuswaehlenErgebnisKonfliktCustomData<T extends SitzberechnungsalgorithmusOption<T>> extends ErgebnisKonfliktCustomData {

  void setContext(SitzberechnungsalgorithmusOptionContext<T> context);

  long getAnzahlZuLosen();

  void setAnzahlZuLosen(long anzahlZuLosen);

  void setBeteiligteOptionen(Collection<T> beteiligteOptionen);

  Collection<T> extractGelosteOptionen(Collection<T> beteiligteOptionen);

  static <E extends SitzberechnungsalgorithmusOption<E>> String formatKonfliktBeschreibung(Messages messages, SitzberechnungsalgorithmusOptionContext<E> context, long anzahlZuLosen,
      List<E> beteiligteOptionen) {
    return messages.lokalisiere(context.getLosentscheidTyp(), //
        anzahlZuLosen, //

        formatKonfliktLosoptionen(messages, beteiligteOptionen), //

        context.getGebiete().stream().map(ErgebnisKonfliktCustomDataFormatter::extractGebietDisplayName).collect(joining(", ")), //
        context.getGruppen().stream().map(ErgebnisKonfliktCustomDataFormatter::extractPolitischeGruppeDisplayName).collect(joining(", ")), //
        context.getWahlvorschlaege().stream().map(ErgebnisKonfliktCustomDataFormatter::extractWahlvorschlagDisplayName).collect(joining(", ")), //
        context.getKandidaturen().stream().map(ErgebnisKonfliktCustomDataFormatter::extractKandidaturDisplayName).collect(joining(", ")) //
    );
  }

  static String formatKonfliktLosoptionen(Messages messages, Collection< ? extends SitzberechnungsalgorithmusOption< ? >> optionen) {
    return optionen.stream().map(option -> formatKonfliktLosoption(messages, option)).collect(joining(AbstractErgebnisKonfliktCustomData.DEFAULT_ITEM_SEPARATOR));
  }

  static String formatKonfliktLosoption(Messages messages, SitzberechnungsalgorithmusOption< ? > option) {
    return formatKonfliktLosoption(messages, option.getId(), option);
  }

  static String formatKonfliktLosoption(Messages messages, Long optionId, SitzberechnungsalgorithmusOption< ? > option) {
    return option == null ? "Losoption " + optionId : option.formatName(messages);
  }
}
