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

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

import java.util.Arrays;
/**
 *  on 08.04.2016.
 * Es werden die Maße aller Parteien in einem Array masse befüllt und danach wird es sortiert (descending),
 * man gibt das letzte Element aus (Maximum).
 * Der Testfall, dass keine Eingaben vor liegen soll0 ausgeben.
 */
public class BrunosRelativesMassArithmetischesMax implements StimmenAbweichungMass {

        private final double gewichtungKleinerParteien;

        public BrunosRelativesMassArithmetischesMax(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[] masse = new double[35];//maximale Anzahl an Parteien
                int i = 0;

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

                    if (prozentEingegeben != 0 && prozentHochgerechnet != 0) {
                        double min = Math.min(prozentEingegeben, prozentHochgerechnet);
                        mass = Math.abs(prozentEingegeben - prozentHochgerechnet) / Math.pow(min, gewichtungKleinerParteien); //Mass-Formel
                        masse[i] = mass;    // Befüllung der Arrays
                        i++;
                    } else if (prozentEingegeben == 0 && prozentHochgerechnet != 0) {
                        double min = 1 / gueltigeEingegeben;
                        mass = Math.abs(prozentEingegeben - prozentHochgerechnet) / Math.pow(min, gewichtungKleinerParteien); //Mass-Formel
                        masse[i] = mass;
                        i++;
                    } else if (prozentEingegeben != 0 && prozentHochgerechnet == 0) {
                        double min = 1 / prozentHochgerechnet;
                        mass = Math.abs(prozentEingegeben - prozentHochgerechnet) / Math.pow(min, gewichtungKleinerParteien); //Mass-Formel
                        masse[i] = mass;
                        i++;
                    }//else leer
                }
                if(i==0){
                    return 0;
                }
                double[] massenew = Arrays.copyOfRange(masse, 0, i);
                Arrays.sort(massenew);

                sum = massenew[massenew.length - 1];
            }
            return 100 * (sum);
        }


        @Override
        public String getMessageKey() {
            return "stimmen.abweichung.mass.relativ.arithmetisches.max";
        }
    }

