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

import java.util.ArrayList;
import java.util.List;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.NlGebiet;
import de.ivu.elect.business.kandidatur.entity.KandidaturKumulierteStimmen;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

@Specializes
public class NlListenkandidaturKumulierteStimmenColumnBuilder extends ListenkandidaturKumulierteStimmenColumnBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  private AbstractColumnEntry<KandidaturKumulierteStimmen> kandidaturKumulierteStimmenAnzahlListenstimmenGewichtetColumn;

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

    if (isMitVoteValueGebieten()) {
      // ELECT-13550
      kandidaturKumulierteStimmenAnzahlListenstimmenGewichtetColumn = new NlKandidaturKumulierteStimmenAnzahlListenstimmenGewichtetColumn(getMessages(), getIcons());
    }
  }

  @Override
  public List<ColumnEntry<? super KandidaturKumulierteStimmen>> getColumnEntriesSorted() {
    List<ColumnEntry<? super KandidaturKumulierteStimmen>> result = new ArrayList<>();

    boolean isListenwahlgebiet = isListenWahlgebiet();


//    if (isListenwahlgebiet) {
    // Unsinnig => raus
      // result.add(kandidaturKumulierteStimmenGebietColumn);
//    }
    result.add(kandidaturKumulierteStimmenWahlvorschlagColumn);
    result.add(kandidaturKumulierteStimmenNameColumn);
    result.add(kandidaturKumulierteStimmenAnzahlListenstimmenColumn);

    if (isMitVoteValueGebieten()) {
      result.add(kandidaturKumulierteStimmenAnzahlListenstimmenGewichtetColumn); // ELECT-13550
    }

    if (isListenwahlgebiet) {
// Rang raus war nicht im alten osv
      //      if (isSitzberechnungsalgorithmusVergibtSitze()) {
//        result.add(kandidaturKumulierteStimmenGewaehltRangListenstimmenColumn);
//      }
      result.add(kandidaturKumulierteStimmenStimmzettelPositionColumn);
    }

    return result;
  }

  private boolean isListenWahlgebiet() {
    return getSelectedGebiet() != null && getSelectedGebiet().isListenwahlgebiet();
  }

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