package de.ivu.elect.presentation.stimmeingabe.table;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections;

import de.ivu.elect.business.ergebnis.control.mass.AbweichungMassStimmenProvider;
import de.ivu.elect.business.ergebnis.control.mass.StimmenAbweichungMass;
import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeHochgerechnet;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;


import static java.util.Arrays.asList;

public class StimmeingabeHochgerechnetAbweichungMassColumn extends AbstractStimmeingabeHochgerechnetColumn {

  private static final long serialVersionUID = 1L;

  private final StimmenAbweichungMass stimmenAbweichungMass;

  protected StimmeingabeHochgerechnetAbweichungMassColumn(Messages messages, StimmenAbweichungMass stimmenAbweichungMass) {
    super(messages);
    this.stimmenAbweichungMass = stimmenAbweichungMass;
  }

  @Override
  public Object getValue(StimmeingabeHochgerechnet entity) {

    Long gueltigeAktuell = entity.getGueltigeAktuell();
    Long gueltigeHochgerechhnet = entity.getGueltigeHochgerechhnet();
    Long anzahlAktuell = entity.getAnzahlAktuell();
    Long anzahlHochgerechnet = entity.getAnzahlHochgerechnet();
    if (gueltigeAktuell == null || gueltigeHochgerechhnet == null || anzahlAktuell == null || anzahlHochgerechnet == null) {
      return null;
    }

    AbweichungMassStimmenProvider stimmenProvider = new AbweichungMassStimmenProvider() {
      @Override
      public Collection<PolitischeGruppe> getPolitischeGruppen() {
        if (entity.getGruppe().isPolitischeGruppe()){
          return asList(entity.getGruppe().castTo(PolitischeGruppe.class).getEntity());
        }
        return Collections.emptyList();
      }

      @Override
      public Collection<Stimmenart> getStimmenarten() {
        return asList(entity.getStimmenart());
      }

      @Override
      public Long getAnzahlStimmenHochgerechnet(PolitischeGruppe politischeGruppe, Stimmenart stimmenart) {
        return anzahlHochgerechnet;
      }

      @Override
      public Long getAnzahlStimmenEingegeben(PolitischeGruppe politischeGruppe, Stimmenart stimmenart) {
        return anzahlAktuell;
      }

      @Override
      public Long getAnzahlGueltigeStimmenHochgerechnet(Stimmenart stimmenart) {
        return gueltigeHochgerechhnet;
      }

      @Override
      public Long getAnzahlGueltigeStimmenEingegeben(Stimmenart stimmenart) {
        return gueltigeAktuell;
      }
    };
    double abweichung = stimmenAbweichungMass.berechneAbweichungImGebiet(stimmenProvider);


    return BigDecimal.valueOf(abweichung);
  }

  @Override
  public String getHeader() {
    return getMessage(stimmenAbweichungMass.getMessageKey())+" " + getMessage("stimmeingabe.hochgerechnet.stimmen.anteil.abweichung.suffix");
  }

  @Override
  public ColumnType getType() {
    return ColumnType.DECIMAL_ONE_FRACTION_DIGIT;
  }
}
