
package de.ivu.elect.presentation.stimmeingabe;

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

import javax.inject.Inject;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeReferendumVorlageStimmen;
import de.ivu.elect.business.stimmen.boundary.StimmenartLabelGenerator;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId(value = "342", mehrfachVergebenOk = true)
public abstract class AbstractStimmeingabeReferendumOptionStimmenErfassenView extends AbstractStimmeingabeKopfzahlErfassenView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient StimmenartLabelGenerator stimmenartLabelGenerator;

  protected AbstractStimmeingabeReferendumOptionStimmenErfassenView() {
    super();
  }

  @Override
  protected boolean isErfassungAufUnterseite() {
    return false;
  }

  public String getStimmeingabenReferendumOptionStimmenReferendumStimmeBezeichnung() {
    return stimmenartLabelGenerator.getReferendumStimmeBezeichnungPlural(getGebiet());
  }

  public boolean isStimmeingabenReferendumVorlageStimmenBezeichnungRendered() {
    return true;
  }

  public List<StimmeingabeReferendumVorlageStimmen> getStimmeingabenReferendumVorlageStimmen() {
    return getStimmeingabeReferendumOptionStimmenErfassenModelBuilder().layoutStimmeingabenReferendumVorlageStimmen(getStimmeingabeReferendumVorlageStimmenErfassenModel(),
        createStimmeingabeGruppeStimmenErfassenModelContext());
  }

  @Override
  protected Collection<Stimmeingabe> getStimmeingabenFuerDiesenView() {
    Collection<Stimmeingabe> result = new HashSet<>(super.getStimmeingabenFuerDiesenView());

    for (StimmeingabeReferendumVorlageStimmen stimmeingabeReferendumVorlageStimmen : getStimmeingabenReferendumVorlageStimmen()) {
      result.addAll(stimmeingabeReferendumVorlageStimmen.getStimmeingaben());
    }

    return result;
  }

  @Override
  protected StimmeingabeErfassenViewStatus createStimmeingabeErfassenViewStatus() {
    if (isAktuellerErgebniseingangErgebniseingabestufeLaesstEingabeZu() && hasPermission(UseCasePermission.STIMMEINGABE_FEHLER_BESTAETIGEN)) {
      if (isLetzterErgebniseingangAktuellVorhandenHavingStatusUngueltigKannFehler()) {
        addMessageAktuellerErgebniseingangErfassungGesperrtByStatusUngueltigKannFehlerKorrigierbar();

        return StimmeingabeErfassenViewStatus.FEHLER_BESTAETIGEN;
      }
    }

    if (isLetzterErgebniseingangAktuellVorhandenHavingStatusGueltig()) {
      return StimmeingabeErfassenViewStatus.NUR_LESEN;
    }

    return super.createStimmeingabeErfassenViewStatus();
  }

  @Override
  protected String getStimmeingabeBezug(Stimmeingabe stimmeingabe) {
    if (isKopfzahlStimmeingabe(stimmeingabe)) {
      return super.getStimmeingabeBezug(stimmeingabe);
    }

    return getStimmeingabeReferendumOptionStimmenErfassenLabelGenerator().getReferendumOptionStimmenStimmeingabeKennung(getEntityAufStimmzettelDaten(), stimmeingabe, getGruppenImGebiet());
  }
}
