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

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisExtendedDAO;
import de.ivu.elect.business.ergebnis.boundary.StimmenExtendedDAO;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.gruppe.boundary.GruppeExtendedDAO;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.table.AbstractColumnEntry;
import de.ivu.elect.presentation.table.ColorColumnEntryWrapper;

@Named(GruppeColumnBuilder.COMPONENT_NAME)
public class GruppeColumnBuilder extends AbstractColumnBuilder<Gruppe> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "gruppeColumnBuilder";

  @Inject
  private transient ErgebnisExtendedDAO ergebnisExtendedDAO;

  @Inject
  private transient StimmenExtendedDAO stimmenExtendedDAO;

  @Inject
  private transient GruppeExtendedDAO gruppeExtendedDAO;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  protected AbstractColumnEntry<Gruppe> gruppeBerechnetePositionColumn;

  protected AbstractColumnEntry<Gruppe> gruppeSchluesselColumn;

  protected AbstractColumnEntry<Gruppe> gruppeGruppeArtColumn;

  protected GruppeNameKennwortColumn gruppeNameKennwortColumn;

  protected AbstractColumnEntry<Gruppe> gruppeFarbeColumn;

  protected AbstractColumnEntry<Gruppe> gruppeMinderheitColumn;

  protected AbstractColumnEntry<Gruppe> gruppePrivilegiertColumn;

  protected AbstractColumnEntry<Gruppe> gruppeInPraesentationColumn;

  protected AbstractColumnEntry<Gruppe> gruppeKurznameColumn;

  protected AbstractColumnEntry<Gruppe> gruppeHatVorperiodenStimmenColumn;

  protected AbstractColumnEntry<Gruppe> gruppeLogoColumn;

  public GruppeColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    gruppeBerechnetePositionColumn = new GruppeBerechnetePositionColumn(getMessages(), getIcons(), getGruppenDerWahl());

    gruppeGruppeArtColumn = AbstractGruppeColumn.createGruppeGruppeArtColumn(getMessages());

    gruppeSchluesselColumn = new GruppeSchluesselSortableColumn<>(getMessages());
    gruppeNameKennwortColumn = new GruppeNameKennwortColumn(getMessages(), getSelectedWahl());
    gruppeKurznameColumn = AbstractGruppeColumn.createGruppeKurznameColumn(getMessages());

    gruppeFarbeColumn = ColorColumnEntryWrapper.wrap(AbstractGruppeColumn.createGruppeFarbeColumn(getMessages()));
    gruppeLogoColumn = new GruppeLogoColumn(getMessages());

    gruppePrivilegiertColumn = AbstractGruppeColumn.createGruppePrivilegiertColumn(getMessages());
    gruppeMinderheitColumn = new GruppeMinderheitColumn(getMessages(), AbstractPolitischeGruppeColumn.createPolitischeGruppeMinderheitColumn(getMessages()));
    gruppeInPraesentationColumn = AbstractGruppeColumn.createGruppeInPraesentationColumn(getMessages());
    gruppeHatVorperiodenStimmenColumn = new GruppeHatVorperiodenStimmenColumn(getMessages(), getVorperiodenErgebnisse(), stimmenExtendedDAO);
  }

  private List<Gruppe> getGruppenDerWahl() {
    Wahl selectedWahl = getSelectedWahl();
    if (selectedWahl == null) {
      return Collections.emptyList();
    }
    return gruppeExtendedDAO.findByWahl(selectedWahl);
  }

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

    result.add(gruppeBerechnetePositionColumn);

    result.add(gruppeSchluesselColumn);
    result.add(gruppeGruppeArtColumn);
    result.add(gruppeNameKennwortColumn);

    if (!isWahlMitReferendengebietenSelected()) {
      result.add(gruppeLogoColumn);
      result.add(gruppeFarbeColumn);
      result.add(gruppeMinderheitColumn);
      result.add(gruppePrivilegiertColumn);
      result.add(gruppeInPraesentationColumn);
    }

    result.add(gruppeKurznameColumn);

    result.add(gruppeHatVorperiodenStimmenColumn);

    return result;
  }

  public Collection<Ergebnis> getVorperiodenErgebnisse() {
    if (!isWahlSelected()) {
      return new ArrayList<>();

    }

    return ergebnisExtendedDAO.findByWahlAndErgebnisart(getSelectedWahl(), Ergebnisart.VORPERIODE);
  }

  protected boolean isWahlMitReferendengebietenSelected() {
    return isWahlSelected() && getSelectedWahl().isWahlMitReferendengebieten();
  }

  protected boolean isWahlSelected() {
    return wahlSessionSelect.isSelected();
  }

  protected Wahl getSelectedWahl() {
    return wahlSessionSelect.getEntity();
  }
}
