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

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.NlGebiet;
import de.ivu.elect.business.gruppe.entity.GruppeKumulierteStimmen;
import de.ivu.elect.jee.presentation.dynamictable.ColumnGroup;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;
import java.util.List;

@Specializes
public class NlGruppeKumulierteStimmenColumnBuilder extends GruppeKumulierteStimmenColumnBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  private ColumnGroup<GruppeKumulierteStimmen> listenstimmenGewichtetGroup;

  private AbstractGruppeKumulierteStimmenColumn anzahlListenstimmenGewichtetColumn;

  private AbstractGruppeKumulierteStimmenColumn anteilListenstimmenGewichtetColumn;

  @Override
  protected void initColumns() {
    super.initColumns();

    if (isMitVoteValueGebieten()) {
      anzahlListenstimmenGewichtetColumn = new NlGruppeKumulierteStimmenAnzahlListenstimmenGewichtetColumn(getMessages());
      anteilListenstimmenGewichtetColumn = new NlGruppeKumulierteStimmenAnteilListenstimmenGewichtetColumn(getMessages());
    }
  }

  @Override
  protected void initColumnGroups() {
    super.initColumnGroups();

    if (isMitVoteValueGebieten()) {
      listenstimmenGewichtetGroup = new ColumnGroup<>(getMessage("gruppe.kumulierte.stimmen.stimmen.gewichtet"));
      listenstimmenGewichtetGroup.addColumn(anzahlListenstimmenGewichtetColumn);
      listenstimmenGewichtetGroup.addColumn(anteilListenstimmenGewichtetColumn);
    }
  }

  @Override
  protected List<ColumnGroup<? super GruppeKumulierteStimmen>> getColumnGroupsSorted() {
    List<ColumnGroup<? super GruppeKumulierteStimmen>> columnGroupsSorted = super.getColumnGroupsSorted();

    if (isMitVoteValueGebieten()) {
      columnGroupsSorted.add(listenstimmenGewichtetGroup);
    }

    return columnGroupsSorted;
  }

  private boolean isMitVoteValueGebieten() {
    return !NlGebiet.collectVoteValueGebiete(getSelectedWahl(), gebietExtendedDAO).isEmpty();
  }
}
