
package de.ivu.elect.business.sitzberechnung.control.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

import de.ivu.elect.sitzberechnung.math.Fraction;

/**
 * Utility rund um Prozenthuerden
 */
public class ProzenthuerdeUtil {

  /**
   * Stelle einen Bruch als Dezimalzahl dar. Dabei wird auf die angegebene Anzahl Stellen gerundet. Normalerweise mit
   * RoundingMode.HALF_UP (kaufmännisch). Nur wenn dann durch Aufrunden genau die Prozenthürde erreicht wird, muss
   * abgerundet werden.
   */
  public static String displayFractionMitHuerde(Fraction fraction, int prozenthuerde, int scale) {
    BigDecimal gerundet = fraction.toBigDecimal(scale, RoundingMode.HALF_UP);
    Fraction prozenthuerdeAlsBruch = Fraction.getFraction(prozenthuerde, 1);
    BigDecimal prozenthuerdeGerundet = prozenthuerdeAlsBruch.toBigDecimal(scale, RoundingMode.HALF_UP);
    if (gerundet.equals(prozenthuerdeGerundet) && fraction.compareTo(prozenthuerdeAlsBruch) < 0) {
      gerundet = fraction.toBigDecimal(scale, RoundingMode.DOWN);
    }

    return gerundet.toPlainString();
  }

  public static String displayFractionMitHuerde(Fraction fraction, BigDecimal prozenthuerde, int scale) {
    BigDecimal gerundet = fraction.toBigDecimal(scale, RoundingMode.HALF_UP);

    Fraction prozenthuerdeAlsBruch = Fraction.getFraction(prozenthuerde.unscaledValue().longValue(), 1);
    Fraction ten = Fraction.getFraction(10, 1);
    for (int i = 0; i < prozenthuerde.scale(); ++i) {
      prozenthuerdeAlsBruch = prozenthuerdeAlsBruch.divideBy(ten);
    }

    BigDecimal prozenthuerdeGerundet = BigDecimal.valueOf(prozenthuerdeAlsBruch.getNumerator())
        .divide(BigDecimal.valueOf(prozenthuerdeAlsBruch.getDenominator()), scale, RoundingMode.HALF_UP);
    if (gerundet.equals(prozenthuerdeGerundet) && fraction.compareTo(prozenthuerdeAlsBruch) < 0) {
      gerundet = fraction.toBigDecimal(scale, RoundingMode.DOWN);
    }

    return gerundet.toPlainString();
  }

  public static long getMindeststimmenzahlBeiHuerde(long gesamtstimmen, int prozenthuerde) {
    return (gesamtstimmen * prozenthuerde + 99) / 100;
  }

  public static long getMindeststimmenzahlBeiHuerde(long gesamtstimmen, BigDecimal prozenthuerde) {
    return BigDecimal.valueOf(gesamtstimmen).multiply(prozenthuerde).scaleByPowerOfTen(-2)
        .setScale(0, RoundingMode.CEILING).longValueExact();
  }

}
