
package de.ivu.elect.presentation.verteilung;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.ivu.elect.business.verteilung.boundary.VerteilungAlgorithmus;
import de.ivu.elect.business.verteilung.boundary.VerteilungBerechnung;
import de.ivu.elect.business.verteilung.boundary.VerteilungContext;
import de.ivu.elect.business.verteilung.boundary.VerteilungErgebnis;
import de.ivu.elect.business.verteilung.boundary.VerteilungTeilnehmer;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.presentation.verteilung.form.AbstractVerteilungBerechnenViewFormBuilder;

public class VerteilungBerechnenViewContext {

  private final Class< ? > viewFormBuilderClass;

  private final VerteilungContext verteilungContext;

  private final VerteilungBerechnung verteilungBerechnung;

  private VerteilungBerechnenViewMehrheitssicherung mehrheitssicherung;

  private Long anzahlTeilnehmer;

  private Collection<String> teilnehmerKeysSelected;

  private Map<VerteilungTeilnehmer, List<VerteilungTeilnehmer>> teilnehmerVerbindungen;

  private VerteilungBerechnenViewAlgorithmusBeispiel algorithmusBeispiel;

  public VerteilungBerechnenViewContext(Messages messages, UserLocale userLocale, AbstractVerteilungBerechnenViewFormBuilder viewFormBuilder, VerteilungBerechnung verteilungBerechnung) {
    super();

    this.viewFormBuilderClass = viewFormBuilder == null ? null : viewFormBuilder.getClass();

    this.verteilungContext = new VerteilungContext(messages, userLocale.getLocale());
    this.verteilungBerechnung = verteilungBerechnung;

    this.mehrheitssicherung = VerteilungBerechnenViewMehrheitssicherung.OHNE;

    this.anzahlTeilnehmer = null;

    this.teilnehmerKeysSelected = new ArrayList<>();

    this.teilnehmerVerbindungen = new HashMap<>();

    this.algorithmusBeispiel = null;
  }

  public Class< ? > getViewFormBuilderClass() {
    return viewFormBuilderClass;
  }

  public VerteilungContext getVerteilungContext() {
    return verteilungContext;
  }

  public VerteilungErgebnis verteile(Map<VerteilungTeilnehmer, Long> anzahlSitzeVerteiltVorabPerTeilnehmer) {
    return verteilungBerechnung.verteile(verteilungContext, anzahlSitzeVerteiltVorabPerTeilnehmer);
  }

  public Collection<VerteilungAlgorithmus> collectAlgorithmen() {
    return verteilungBerechnung.collectAlgorithmen();
  }

  public String getAlgorithmus() {
    return verteilungContext.getAlgorithmus();
  }

  public void setAlgorithmus(String algorithmus) {
    verteilungContext.setAlgorithmus(algorithmus);
  }

  public VerteilungBerechnenViewMehrheitssicherung getMehrheitssicherung() {
    return mehrheitssicherung;
  }

  public void setMehrheitssicherung(VerteilungBerechnenViewMehrheitssicherung mehrheitssicherung) {
    this.mehrheitssicherung = mehrheitssicherung;
  }

  public Long getAnzahlSitzeZuVerteilen() {
    return verteilungContext.getAnzahlSitzeZuVerteilen();
  }

  public void setAnzahlSitzeZuVerteilen(Long anzahlSitzeZuVerteilen) {
    verteilungContext.setAnzahlSitzeZuVerteilen(anzahlSitzeZuVerteilen);
  }

  public Long getAnzahlTeilnehmer() {
    return anzahlTeilnehmer;
  }

  public void setAnzahlTeilnehmer(Long anzahlTeilnehmer) {
    this.anzahlTeilnehmer = anzahlTeilnehmer;
  }

  public Collection<String> getTeilnehmerKeysSelected() {
    return new ArrayList<>(teilnehmerKeysSelected);
  }

  public void setTeilnehmerKeysSelected(Collection<String> teilnehmerKeysSelected) {
    this.teilnehmerKeysSelected = teilnehmerKeysSelected;
  }

  public List<VerteilungTeilnehmer> getTeilnehmer() {
    return new ArrayList<>(verteilungContext.getTeilnehmer());
  }

  public void setTeilnehmer(List<VerteilungTeilnehmer> teilnehmer) {
    verteilungContext.setTeilnehmer(teilnehmer);
  }

  public Map<VerteilungTeilnehmer, List<VerteilungTeilnehmer>> getTeilnehmerVerbindungen() {
    return new HashMap<>(teilnehmerVerbindungen);
  }

  public void setTeilnehmerVerbindungen(Map<VerteilungTeilnehmer, List<VerteilungTeilnehmer>> teilnehmerVerbindungen) {
    this.teilnehmerVerbindungen = teilnehmerVerbindungen;
  }

  public VerteilungBerechnenViewAlgorithmusBeispiel getAlgorithmusBeispiel() {
    return algorithmusBeispiel;
  }

  public void setAlgorithmusBeispiel(VerteilungBerechnenViewAlgorithmusBeispiel algorithmusBeispiel) {
    this.algorithmusBeispiel = algorithmusBeispiel;
  }
}
