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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;

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

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.kandidatur.entity.KandidaturStimmzettelPersonendaten;
import de.ivu.elect.business.kandidatur.entity.ListenkandidaturStimmzettelPosition;
import de.ivu.elect.business.stimmeingabe.boundary.AbstractStimmeingabeReferendumVorlageStimmenModelBuilder;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.ZwischensummeEingabe;
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.ReferendumOption;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStimmzettelPosition;

/*
 * Manchmal ist es einfach egal, welche Labels generiert werden. Hää?!
 */
public class DefaultStimmeingabeErfassenLabelGenerator
    implements
      StimmeingabeKopfzahlErfassenLabelGenerator,
      StimmeingabeGruppeStimmenErfassenLabelGenerator,
      StimmeingabeListenkandidaturStimmenErfassenLabelGenerator,
      StimmeingabeReferendumOptionStimmenErfassenLabelGenerator {

  public static final DefaultStimmeingabeErfassenLabelGenerator INSTANCE = new DefaultStimmeingabeErfassenLabelGenerator();

  private static final String DEFAULT_STRING_RETURN_VALUE = null;

  public DefaultStimmeingabeErfassenLabelGenerator() {
    super();
  }

  @Override
  public String getKopfzahlKennung(GruppeImGebiet gruppeImGebiet, Ergebniseingangsart ergebniseingangsart, Stimmenart stimmenart) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getKopfzahlBezeichnung(GruppeImGebiet gruppeImGebiet, Ergebniseingangsart ergebniseingangsart, Stimmenart stimmenart) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getKopfzahlKennung(GruppeImGebiet gruppeImGebiet, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getKopfzahlBezeichnung(GruppeImGebiet gruppeImGebiet, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getKopfzahlStimmeingabeKennung(Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getKopfzahlStimmeingabeBezeichnung(Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public WahlvorschlagStimmzettelPosition getWahlvorschlagStimmzettelPosition(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return WahlvorschlagStimmzettelPosition.EMPTY;
  }

  @Override
  public String getGruppeStimmenKennungFortlaufend(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Long positionFortlaufend, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart,
      Stimmenart stimmenart, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart, Stimmenart stimmenart,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart, Stimmenart stimmenart,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public boolean isGruppeStimmenStimmeingabeGruppeBezeichnungRendered() {
    return false;
  }

  @Override
  public String getGruppeStimmenStimmeingabeGruppeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenStimmeingabeKennungFortlaufend(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Long stimmeingabeIndexOneBased, Stimmeingabe stimmeingabe,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenStimmeingabeKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenStimmeingabeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeStimmenStimmeingabeTooltip(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeDirektstimmenStimmeingabeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet,
      Supplier<Map<Gruppe, Collection<Wahlvorschlag>>> wahlvorschlaege) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getGruppeDirektstimmenStimmeingabeTooltip(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet,
      Supplier<Map<Gruppe, Collection<Wahlvorschlag>>> wahlvorschlaege) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getListenkandidaturStimmenKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getListenkandidaturStimmenBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, GruppeImGebiet gruppeImGebiet, WahlartErgebnisart ergebnisart,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getListenkandidaturStimmenStimmeingabeKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getListenkandidaturStimmenStimmeingabeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getListenkandidaturStimmenStimmeingabeTooltip(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public ListenkandidaturStimmzettelPosition getListenkandidaturStimmzettelPosition(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return ListenkandidaturStimmzettelPosition.EMPTY;
  }

  @Override
  public KandidaturStimmzettelPersonendaten getListenkandidaturStimmzettelName(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return KandidaturStimmzettelPersonendaten.EMPTY;
  }

  @Override
  public boolean isStimmeingabeZwischensummeAnzahlAbgegebenGesamt(Stimmeingabe stimmeingabe) {
    return isStimmeingabeZwischensumme(stimmeingabe, AbstractStimmeingabeReferendumVorlageStimmenModelBuilder.GRUPPE_STIMMEN_ABGEGEBEN_GESAMT_ZWISCHENSUMME_INDEX);
  }

  @Override
  public boolean isStimmeingabeZwischensummeAnzahlUngueltigeGesamt(Stimmeingabe stimmeingabe) {
    return isStimmeingabeZwischensumme(stimmeingabe, AbstractStimmeingabeReferendumVorlageStimmenModelBuilder.GRUPPE_STIMMEN_UNGUELTIGE_GESAMT_ZWISCHENSUMME_INDEX);
  }

  @Override
  public boolean isStimmeingabeZwischensummeAnzahlGueltigeGesamt(Stimmeingabe stimmeingabe) {
    return isStimmeingabeZwischensumme(stimmeingabe, AbstractStimmeingabeReferendumVorlageStimmenModelBuilder.GRUPPE_STIMMEN_GUELTIGE_GESAMT_ZWISCHENSUMME_INDEX);
  }

  @Override
  public boolean isStimmeingabeZwischensummeAnzahlUebrigeGesamt(Stimmeingabe stimmeingabe) {
    return isStimmeingabeZwischensumme(stimmeingabe, AbstractStimmeingabeReferendumVorlageStimmenModelBuilder.GRUPPE_STIMMEN_UEBRIGE_GESAMT_ZWISCHENSUMME_INDEX);
  }

  private boolean isStimmeingabeZwischensumme(Stimmeingabe stimmeingabe, long summenIndex) {
    if (stimmeingabe != null && stimmeingabe.isZwischensummeEingabe()) {
      return Objects.equals(castTo(stimmeingabe, ZwischensummeEingabe.class).getSummenIndex(), summenIndex);
    }

    return false;
  }

  @Override
  public String getReferendumOptionStimmenKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, ReferendumOption referendumOption, GruppeImGebiet gruppeImGebiet,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getReferendumOptionStimmenBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, ReferendumOption referendumOption, GruppeImGebiet gruppeImGebiet,
      Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getReferendumOptionStimmenStimmeingabeKennung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public String getReferendumOptionStimmenStimmeingabeBezeichnung(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Stimmeingabe stimmeingabe, Collection<GruppeImGebiet> gruppenImGebiet) {
    return DEFAULT_STRING_RETURN_VALUE;
  }

  @Override
  public boolean isAkzeptiertWahlart(Wahlart wahlart) {
    // soll nicht automatisch als LabelGenerator benutzt werden
    return false;
  }

  @Override
  public boolean isGruppeHatKennung() {
    return false;
  }

  @Override
  public String getStimmenartName(Gebiet gebiet, Stimmenart stimmenart) {
    return DEFAULT_STRING_RETURN_VALUE;
  }
}
