
package de.ivu.elect.presentation.stimmeingabe;

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

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

import de.ivu.elect.business.stimmeingabe.control.StimmeingabeListenkandidaturStimmenGrouper;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeListenkandidaturStimmen;
import de.ivu.elect.business.stimmeingabe.entity.ZwischensummeEingabe;

public abstract class AbstractStimmeingabeListenkandidaturStimmenErfassenViewHavingListenkandidaturStimmenGroups extends AbstractStimmeingabeListenkandidaturStimmenErfassenView {

  private static final long serialVersionUID = 1L;

  protected List<List<StimmeingabeListenkandidaturStimmen>> stimmeingabenListenkandidaturStimmenGroups;

  protected AbstractStimmeingabeListenkandidaturStimmenErfassenViewHavingListenkandidaturStimmenGroups() {
    super();
  }

  @Override
  protected String getStimmeingabeBezug(Stimmeingabe stimmeingabe) {
    if (stimmeingabe != null && stimmeingabe.isZwischensummeEingabe()) { // ELECTMUC-2377
      ZwischensummeEingabe zwischensummeEingabe = castTo(stimmeingabe, ZwischensummeEingabe.class);

      if (zwischensummeEingabe.hasSummenNameAnzeigbar()) {
        return zwischensummeEingabe.getSummenName();
      }
    }

    return super.getStimmeingabeBezug(stimmeingabe);
  }

  public boolean isStimmeingabenListenkandidaturStimmenContainsStimmeingabenListenStimmen() {
    return getStimmeingabeListenkandidaturStimmenGrouper().isListeStimmenInBlockMitListenkandidaturStimmenDarstellen(getWahl());
  }

  public List<StimmeingabeListenkandidaturStimmen> getStimmeingabenListenkandidaturStimmenMitZwischensummen() {
    List<StimmeingabeListenkandidaturStimmen> result = new ArrayList<>();

    for (List<StimmeingabeListenkandidaturStimmen> group : getStimmeingabenListenkandidaturStimmenMitZwischensummenGroups()) {
      result.addAll(group);
    }

    return result;
  }

  public List<List<StimmeingabeListenkandidaturStimmen>> getStimmeingabenListenkandidaturStimmenMitZwischensummenGroups() {
    List<List<StimmeingabeListenkandidaturStimmen>> result = new ArrayList<>();

    List<List<StimmeingabeListenkandidaturStimmen>> groupsOfStimmeingabenListenkandidaturStimmenIncludingPlatzhalter = getGroupsOfStimmeingabenListenkandidaturStimmenIncludingPlatzhalter();
    List<StimmeingabeListenkandidaturStimmen> stimmeingabenListenkandidaturStimmenZwischensummen = getStimmeingabenListenkandidaturStimmenZwischensummen();

    for (int groupIndex = 0; groupIndex < groupsOfStimmeingabenListenkandidaturStimmenIncludingPlatzhalter.size(); groupIndex++) {
      List<StimmeingabeListenkandidaturStimmen> group = new ArrayList<>(groupsOfStimmeingabenListenkandidaturStimmenIncludingPlatzhalter.get(groupIndex));

      if (groupIndex < stimmeingabenListenkandidaturStimmenZwischensummen.size()) {
        group.add(stimmeingabenListenkandidaturStimmenZwischensummen.get(groupIndex));
      }

      result.add(group);
    }

    return result;
  }

  private List<List<StimmeingabeListenkandidaturStimmen>> getGroupsOfStimmeingabenListenkandidaturStimmenIncludingPlatzhalter() {
    if (stimmeingabenListenkandidaturStimmenGroups == null) {
      stimmeingabenListenkandidaturStimmenGroups = getStimmeingabeListenkandidaturStimmenGrouper().createGroupsOfStimmeingabenListenkandidaturStimmenIncludingPlatzhalter(getWahl(),
          getStimmeingabeListenStimmen(), getStimmeingabenListenkandidaturStimmen());
    }

    return stimmeingabenListenkandidaturStimmenGroups;
  }

  protected abstract StimmeingabeListenkandidaturStimmenGrouper getStimmeingabeListenkandidaturStimmenGrouper();

  @Override
  public String reset() {
    stimmeingabenListenkandidaturStimmenGroups = null;

    return super.reset();
  }
}
