package de.ivu.elect.business.ergebnis.control.mass;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;

/**
 *  on 08.04.2016.
 * arithmetisches Mittel mit konstanter Grenze: alle werte darunter nicht berücksichtigen
 * konstante Grenze :momentan wird für jedes maß pro partei wenn Mass<0.0099, 0 angezeigt , aber mittelwert berechnung richtig!
 */

public class BrunosRelativesMassArithmetischesMittelKonstanteGrenze implements StimmenAbweichungMass{

    private final double gewichtungKleinerParteien;

    public BrunosRelativesMassArithmetischesMittelKonstanteGrenze (double gewichtungKleinerParteien) {
        this.gewichtungKleinerParteien = gewichtungKleinerParteien;
    }
    @Override
    public double berechneAbweichungImGebiet(AbweichungMassStimmenProvider stimmenProvider) {

        double sum=0;
        double sumnew=0;

        for (Stimmenart stimmabgabeart : stimmenProvider.getStimmenarten()) {

            double gueltigeEingegeben = (double) Math.max(1, stimmenProvider.getAnzahlGueltigeStimmenEingegeben(stimmabgabeart));
            double gueltigeHochgerechnet = (double) Math.max(1, stimmenProvider.getAnzahlGueltigeStimmenHochgerechnet(stimmabgabeart));
            double mass;
            int i = 0;

            for (PolitischeGruppe politischeGruppe : stimmenProvider.getPolitischeGruppen()) {
                double prozentEingegeben = stimmenProvider.getAnzahlStimmenEingegeben(politischeGruppe, stimmabgabeart) / gueltigeEingegeben;
                double prozentHochgerechnet = stimmenProvider.getAnzahlStimmenHochgerechnet(politischeGruppe, stimmabgabeart) / gueltigeHochgerechnet;

                if(prozentEingegeben!=0 && prozentHochgerechnet!=0) {
                    double min = Math.min(prozentEingegeben, prozentHochgerechnet);
                    mass = Math.abs(prozentEingegeben - prozentHochgerechnet) / Math.pow(min, gewichtungKleinerParteien); //Mass-Formel
                    if(mass>0.0099d){
                        sum+=mass;
                        i++;
                    }
                }
                else if (prozentEingegeben==0 && prozentHochgerechnet!=0){
                    double min = 1/gueltigeEingegeben;
                    mass = Math.abs(prozentEingegeben - prozentHochgerechnet) / Math.pow(min, gewichtungKleinerParteien); //Mass-Formel
                    if(mass>0.0099d){
                        sum+=mass;
                        i++;
                    }
                }
                else if (prozentEingegeben!=0 && prozentHochgerechnet==0){
                    double min = 1/prozentHochgerechnet;
                    mass = Math.abs(prozentEingegeben - prozentHochgerechnet) / Math.pow(min, gewichtungKleinerParteien); //Mass-Formel
                    if(mass>0.0099d){
                        sum+=mass;
                        i++;
                    }
                }
                else{
                    sum+=0;
                }
            }
            sumnew=sum/Math.max(i,1);
        }
        return 100*(sumnew);
    }
    @Override
    public String getMessageKey() {
        return "stimmen.abweichung.mass.relativ.arithmetisches.mittel.k";
    }
}
