
package de.ivu.elect.business.verteilung.boundary;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.sitzberechnung.math.Fraction;

public class VerteilungContext {

  private final Messages messages;

  private final Locale locale;

  private String algorithmus;

  private int fractionConverterAnzahlNachkommastellen;

  private Long anzahlSitzeZuVerteilen;

  private List<VerteilungTeilnehmer> teilnehmer;

  public VerteilungContext(Messages messages, Locale locale) {
    super();

    this.messages = messages;

    this.locale = locale;

    this.algorithmus = "";

    this.fractionConverterAnzahlNachkommastellen = 4;

    this.anzahlSitzeZuVerteilen = null; // Initial anzugeben...

    this.teilnehmer = new ArrayList<>();
  }

  public Messages getMessages() {
    return messages;
  }

  public String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  public String getMessage(Enum< ? > enumValue, Object... params) {
    return getMessages().lokalisiere(enumValue, params);
  }

  public String formatBruchDezimal(Fraction number) {
    return formatBruchDezimal(getLocale(), number, getFractionConverterAnzahlNachkommastellen());
  }

  public Locale getLocale() {
    return locale;
  }

  public String getAlgorithmus() {
    return algorithmus;
  }

  public void setAlgorithmus(String algorithmus) {
    this.algorithmus = algorithmus;
  }

  public int getFractionConverterAnzahlNachkommastellen() {
    return fractionConverterAnzahlNachkommastellen;
  }

  public void setFractionConverterAnzahlNachkommastellen(int fractionConverterAnzahlNachkommastellen) {
    this.fractionConverterAnzahlNachkommastellen = fractionConverterAnzahlNachkommastellen;
  }

  public Long getAnzahlSitzeZuVerteilen() {
    return anzahlSitzeZuVerteilen;
  }

  public void setAnzahlSitzeZuVerteilen(Long anzahlSitzeZuVerteilen) {
    this.anzahlSitzeZuVerteilen = anzahlSitzeZuVerteilen;
  }

  public List<VerteilungTeilnehmer> getTeilnehmer() {
    return teilnehmer;
  }

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

  private static String formatBruchDezimal(Locale locale, Number number, int anzahlNachkommastellen) {
    NumberFormat numberFormat = NumberFormat.getInstance(locale);
    numberFormat.setMinimumFractionDigits(anzahlNachkommastellen);
    numberFormat.setMaximumFractionDigits(anzahlNachkommastellen);

    return numberFormat.format(number);
  }

  public static String formatBruchGemein(String zaehler, String nenner) {
    return (zaehler == null ? "" : zaehler) + " / " + (nenner == null ? "" : nenner);
  }

  public static long fixNonPositiveToZero(Long value) {
    if (value == null || value < 0L) {
      return 0L;
    }

    return value;
  }
}
