
package de.ivu.elect.business.stimmeingabe.control;

import java.util.Collection;
import java.util.Map;
import java.util.function.Supplier;

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStimmzettelPosition;

public interface StimmeingabeGruppeStimmenErfassenLabelGenerator extends StimmeingabeStimmenartLabelGenerator {

  boolean isAkzeptiertWahlart(Wahlart wahlart);

  /**
   * @return <code>true</code>, wenn Gruppen eine Kennung zugeordnet werden kann.
   *
   *         ELECT-2049 Bei manchen Wahlarten haben die Gruppen keine oder keine eindeutige Kennung.
   */
  boolean isGruppeHatKennung();

  @Nullable
  WahlvorschlagStimmzettelPosition getWahlvorschlagStimmzettelPosition(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, Collection<GruppeImGebiet> gruppenImGebiet);

  /**
   * Kennzeichnet die Stimmen einer Gruppe. Üblicherweise ein Kürzel aus Buchstaben und/oder Ziffern.
   */
  String getGruppeStimmenKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart, Collection<GruppeImGebiet> gruppenImGebiet);

  String getGruppeStimmenKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart, Stimmenart stimmenart,
      Collection<GruppeImGebiet> gruppenImGebiet);

  String getGruppeStimmenStimmeingabeKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, @Nullable Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet);

  /**
   * Bezeichnet die Stimmen einer Gruppe. Üblicherweise eine kurze, textuelle Beschreibung.
   */
  String getGruppeStimmenBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart, Collection<GruppeImGebiet> gruppenImGebiet);

  String getGruppeStimmenBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart, Stimmenart stimmenart,
      Collection<GruppeImGebiet> gruppenImGebiet);

  String getGruppeStimmenStimmeingabeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, @Nullable Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet);

  String getGruppeStimmenStimmeingabeTooltip(EntityAufStimmzettelDaten entityAufStimmzettelDaten, @Nullable Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet);

  boolean isGruppeStimmenStimmeingabeGruppeBezeichnungRendered();

  String getGruppeStimmenStimmeingabeGruppeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, @Nullable Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet);

  /**
   * ELECTDD-243 Bezeichnet den Namen des Direktkandidaten (Erststimme)
   */
  String getGruppeDirektstimmenStimmeingabeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, @Nullable Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet,
      Supplier<Map<Gruppe, Collection<Wahlvorschlag>>> wahlvorschlaege);

  String getGruppeDirektstimmenStimmeingabeTooltip(EntityAufStimmzettelDaten entityAufStimmzettelDaten, @Nullable Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet,
      Supplier<Map<Gruppe, Collection<Wahlvorschlag>>> wahlvorschlaege);
}
