
package de.ivu.elect.presentation.stimmeingabe;

import java.util.ArrayList;
import java.util.List;

import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabeGruppeStimmenErfassenModelContext;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmen;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmenErfassenModel;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmenTableLayout;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabefehlerart;
import de.ivu.elect.jee.presentation.redirect.Redirect;

public abstract class AbstractStimmeingabeGruppeStimmenReadonlyViewLinkingListenkandidaturStimmenUnterseite extends AbstractStimmeingabeGruppeStimmenErfassenView
    implements
      StimmeingabeErfassenViewLinkingUnterseite {

  private static final long serialVersionUID = 1L;

  private StimmeingabeGruppeStimmen selectedStimmeingabeGruppeStimmen;

  private List<StimmeingabeGruppeStimmen> stimmeingabenGruppeStimmenReadonly;

  public AbstractStimmeingabeGruppeStimmenReadonlyViewLinkingListenkandidaturStimmenUnterseite() {
    super();
  }

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

  @Override
  protected boolean isStimmeingabenGruppeStimmenListenstimmeRendered() {
    return true;
  }

  @Override
  public StimmeingabeGruppeStimmen getSelectedStimmeingabeGruppeStimmen() {
    return selectedStimmeingabeGruppeStimmen;
  }

  @Override
  public void setSelectedStimmeingabeGruppeStimmen(StimmeingabeGruppeStimmen selectedStimmeingabeGruppeStimmen) {
    this.selectedStimmeingabeGruppeStimmen = selectedStimmeingabeGruppeStimmen;
  }

  public StimmeingabeGruppeStimmenTableLayout getStimmeingabenGruppeStimmenReadonlyTableLayout() {
    StimmeingabeGruppeStimmenTableLayout stimmeingabenGruppeStimmenTableLayout = getStimmeingabenGruppeStimmenTableLayout();

    return new StimmeingabeGruppeStimmenTableLayout( //
        isErfassungGesperrt(), //

        stimmeingabenGruppeStimmenTableLayout.isKennungVorStimmeingabeRendered(), //
        stimmeingabenGruppeStimmenTableLayout.getKennungVorStimmeingabeHeader(), //

        stimmeingabenGruppeStimmenTableLayout.isKennungNachStimmeingabeRendered(), //
        stimmeingabenGruppeStimmenTableLayout.getKennungNachStimmeingabeHeader(), //

        stimmeingabenGruppeStimmenTableLayout.isBezeichnungRendered(), //
        stimmeingabenGruppeStimmenTableLayout.getBezeichnungHeader(), //

        stimmeingabenGruppeStimmenTableLayout.isAnzahlDirektstimmeRendered(), //
        stimmeingabenGruppeStimmenTableLayout.getAnzahlDirektstimmeHeader(), //

        stimmeingabenGruppeStimmenTableLayout.isAnzahlDirektstimmeVergleichRendered(), //
        stimmeingabenGruppeStimmenTableLayout.getAnzahlDirektstimmeVergleichHeader(), //

        stimmeingabenGruppeStimmenTableLayout.isAnzahlListenstimmeRendered(), //
        getMessage("stimmeingabe.gruppe.stimmen.stimmeingabe.stimmen.anzahl.eingabe"), //

        stimmeingabenGruppeStimmenTableLayout.isAnzahlListenstimmeVergleichRendered(), //
        stimmeingabenGruppeStimmenTableLayout.getAnzahlListenstimmeVergleichHeader() //
    );
  }

  // NICHT als AbstractStimmeingabeGruppeStimmenErfassenView#getStimmeingabenGruppeStimmen überschreiben, da sonst falsche Fehlermeldungen (von den Unterseiten) angezeigt werden!!!
  public List<StimmeingabeGruppeStimmen> getStimmeingabenGruppeStimmenReadonly() {
    if (stimmeingabenGruppeStimmenReadonly == null) {
      // HINT: wir müssen hier einen umständlicheren Weg gehen, da die Gruppenseite keine erfassbaren Gruppestimmen aufweist...
      stimmeingabenGruppeStimmenReadonly = layoutStimmeingabenGruppeStimmenReadonly(getStimmeingabeGruppeStimmenErfassenModel(), createStimmeingabeGruppeStimmenErfassenModelContext());
    }

    return stimmeingabenGruppeStimmenReadonly;
  }

  protected abstract List<StimmeingabeGruppeStimmen> layoutStimmeingabenGruppeStimmenReadonly(StimmeingabeGruppeStimmenErfassenModel stimmeingabeGruppeStimmenErfassenModel,
      StimmeingabeGruppeStimmenErfassenModelContext stimmeingabeGruppeStimmenErfassenModelContext);

  @Override
  protected List<StimmeingabeGruppeStimmen> getStimmeingabeGruppeStimmenReferencingListenkandidaturStimmenUnterseite() {
    return getStimmeingabenGruppeStimmenReadonly(); // HINT: wir müssen hier einen umständlicheren Weg gehen, da die Gruppenseite keine Gruppestimmen aufweist...
  }

  @Override
  protected List<StimmeingabePlausiFehler> createStimmeingabePlausiFehler(Stimmeingabefehlerart fehlerart) {
    List<StimmeingabePlausiFehler> result = new ArrayList<>(super.createStimmeingabePlausiFehler(fehlerart));
    result.addAll(collectStimmeingabePlausiFehlerReferencingListenkandidaturStimmenUnterseite(fehlerart));

    return result;
  }

  @Redirect
  @Override
  public String reset() {
    selectedStimmeingabeGruppeStimmen = null;
    stimmeingabenGruppeStimmenReadonly = null;

    return super.reset();
  }
}
