
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(SitzberechnungsalgorithmusOptionContext<E> context,
      ErgebnisKonfliktCustomDataFormatter ergebnisKonfliktCustomDataFormatter, long anzahlZuLosen, List<E> beteiligteOptionen) {
    Messages messages = ergebnisKonfliktCustomDataFormatter.getMessages();

    return messages.lokalisiere(context.getLosentscheidTyp(), //
        anzahlZuLosen, //

        formatKonfliktLosoptionen(ergebnisKonfliktCustomDataFormatter, 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(ErgebnisKonfliktCustomDataFormatter ergebnisKonfliktCustomDataFormatter, Collection< ? extends SitzberechnungsalgorithmusOption< ? >> optionen) {
    return optionen.stream().map(option -> formatKonfliktLosoption(ergebnisKonfliktCustomDataFormatter, option)).collect(joining(AbstractErgebnisKonfliktCustomData.DEFAULT_ITEM_SEPARATOR));
  }

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

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