
package de.ivu.elect.presentation.verteilung.form;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.inject.Inject;

import de.ivu.elect.business.gruppe.boundary.GruppeExtendedDAO;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.GruppePK;
import de.ivu.elect.business.verteilung.boundary.VerteilungTeilnehmer;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.verteilung.VerteilungBerechnenViewContext;

public class VerteilungBerechnenViewFormBuilderVorbelegungSitze extends AbstractVerteilungBerechnenViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GruppeExtendedDAO gruppeExtendedDAO;

  private Map<GruppePK, Long> anzahlSitzePerGruppePK;

  public VerteilungBerechnenViewFormBuilderVorbelegungSitze() {
    super();

    this.anzahlSitzePerGruppePK = new HashMap<>();
  }

  @Override
  public String getPageTitle() {
    return getMessage("verteilung.berechnen.VerteilungBerechnenViewFormBuilderVorbelegungSitze.page.title");
  }

  @Override
  public String getPageHeader() {
    return getMessage("verteilung.berechnen.VerteilungBerechnenViewFormBuilderVorbelegungSitze.page.header");
  }

  @Override
  protected String getViewFormBuilderBeschreibung() {
    return getMessage("verteilung.berechnen.VerteilungBerechnenViewFormBuilderVorbelegungSitze");
  }

  @Override
  public boolean isAnzahlTeilnehmerDynamisch() {
    return false; // Sitze bestimmen die Teilnehmer...
  }

  @Override
  public boolean isTeilnehmerVerbindungMoeglich() {
    return true; // A.k.a. Zählgemeinschaften...
  }

  public void initTeilnehmer(Map<GruppePK, Long> anzahlSitzePerGruppePK) {
    this.anzahlSitzePerGruppePK = new LinkedHashMap<>(anzahlSitzePerGruppePK); // Reihenfolge konstant halten...
  }

  @Override
  protected void addTeilnehmerProperties(FormBuilder formBuilder, VerteilungBerechnenViewContext context) {
    if (context.getTeilnehmer().isEmpty()) {
      List<VerteilungTeilnehmer> teilnehmer = new ArrayList<>();

      int indexZeroBased = 0;

      for (Entry<GruppePK, Long> entry : anzahlSitzePerGruppePK.entrySet()) {
        Gruppe gruppe = gruppeExtendedDAO.findByPrimaryKey(entry.getKey());

        VerteilungTeilnehmer gruppeTeilnehmer = new VerteilungTeilnehmer(indexZeroBased++, gruppe.getSchluessel(), gruppe.getKurzname());
        gruppeTeilnehmer.setAnzahlStimmen(entry.getValue());

        teilnehmer.add(gruppeTeilnehmer);
      }

      context.setTeilnehmer(teilnehmer);
    }

    for (VerteilungTeilnehmer teilnehmer : context.getTeilnehmer()) {
      formBuilder.addProperty(createAnzahlStimmenProperty(context, teilnehmer)).readonly();
    }
  }
}
