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

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietsarteigenschaftExtendedDAO;
import de.ivu.elect.business.wahl.entity.AbstractWahlart;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.business.wahl.entity.WahlartConstants;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;

@Specializes
public class CommonWahlartColumnBuilder extends WahlartColumnBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietsarteigenschaftExtendedDAO gebietsarteigenschaftExtendedDAO;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  private AbstractWahlartColumn<Wahlart> anzahlStimmenProWaehlerColumn;

  private AbstractWahlartColumn<Wahlart> gruppenreihenfolgeVorgegebenColumn;

  private AbstractWahlartColumn<Wahlart> anzahlStimmenProWaehlerArtColumn;

  private AbstractWahlartColumn<Wahlart> gruppenvereinigungenErlaubtColumn;

  private AbstractWahlartColumn<Wahlart> listenverbindungenErlaubtColumn;

  private AbstractWahlartColumn<Wahlart> maxAnzahlErsatzkandidaturenArtColumn;

  private AbstractWahlartColumn<Wahlart> maxAnzahlErsatzkandidaturenColumn;

  private AbstractWahlartColumn<Wahlart> leereListenErlaubtColumn;

  private AbstractWahlartColumn<Wahlart> maxAnzahlNennungenColumn;

  private AbstractWahlartColumn<Wahlart> aOhneWahlscheinVorlaeufigColumn;

  private AbstractWahlartColumn<Wahlart> aOhneWahlscheinEndgueltigColumn;

  private AbstractWahlartColumn<Wahlart> aMitWahlscheinVorlaeufigColumn;

  private AbstractWahlartColumn<Wahlart> aMitWahlscheinEndgueltigColumn;

  private AbstractWahlartColumn<Wahlart> aNichtImWaehlerverzeichnisVorlaeufigColumn;

  private AbstractWahlartColumn<Wahlart> aNichtImWaehlerverzeichnisEndgueltigColumn;

  private AbstractWahlartColumn<Wahlart> aGesamtVorlaeufigColumn;

  private AbstractWahlartColumn<Wahlart> aGesamtEndgueltigColumn;

  private AbstractWahlartColumn<Wahlart> bOhneWahlscheinVorlaeufigColumn;

  private AbstractWahlartColumn<Wahlart> bOhneWahlscheinEndgueltigColumn;

  private AbstractWahlartColumn<Wahlart> bMitWahlscheinVorlaeufigColumn;

  private AbstractWahlartColumn<Wahlart> bMitWahlscheinEndgueltigColumn;

  private AbstractWahlartColumn<Wahlart> bGesamtVorlaeufigColumn;

  private AbstractWahlartColumn<Wahlart> bGesamtEndgueltigColumn;

  private AbstractWahlartColumn<Wahlart> wahlartGebietsartenColumn;

  private AbstractWahlartColumn<Wahlart> wahlartZulassungspruefungColumn;

  private AbstractWahlartColumn<Wahlart> wahlartSystemGebietsebeneColumn;

  private AbstractWahlartColumn<Wahlart> wahlartDokumentvorlagenColumn;

  private AbstractWahlartColumn<Wahlart> wahlartSitzberechnungsalgorithmusColumn;

  public CommonWahlartColumnBuilder() {
    super();
  }

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

    wahlartGebietsartenColumn = new WahlartGebietsartenColumn(getMessages(), gebietsarteigenschaftExtendedDAO.findByAll(mandantSessionSelect.getMandant()));

    wahlartSystemGebietsebeneColumn =
        new AbstractWahlartColumn<>("wahlartSystemGebietsebeneColumn", messages,
            WahlartConstants.MESSAGE_KEY_SYSTEM_GEBIETSEBENE_MEHRZAHL,
            ColumnType.COLLECTION
            , w -> w.getSystemGebietsebenen().stream().map(e -> getMessages().lokalisiere(e)).collect(Collectors.toList()));

    anzahlStimmenProWaehlerArtColumn = AbstractWahlartColumn.createWahlartAnzahlStimmenProWaehlerArtColumn(getMessages());
    anzahlStimmenProWaehlerColumn = AbstractWahlartColumn.createWahlartAnzahlStimmenProWaehlerColumn(getMessages());
    anzahlStimmenProWaehlerColumn.setDisplayFilter((wahlart, value) -> {
      if (wahlart.isWahlMitAnzahlStimmenProWaehlerPerWahlart()) {
        return value;
      }

      return null;
    });

    gruppenreihenfolgeVorgegebenColumn = AbstractWahlartColumn.createWahlartGruppenreihenfolgeVorgegebenColumn(getMessages());

    gruppenvereinigungenErlaubtColumn = AbstractWahlartColumn.createWahlartGruppenvereinigungenErlaubtColumn(getMessages());
    listenverbindungenErlaubtColumn = AbstractWahlartColumn.createWahlartListenverbindungenErlaubtColumn(getMessages());
    leereListenErlaubtColumn = AbstractWahlartColumn.createWahlartLeereListenErlaubtColumn(getMessages());

    maxAnzahlNennungenColumn = AbstractWahlartColumn.createWahlartMaxAnzahlNennungenColumn(getMessages());

    maxAnzahlErsatzkandidaturenArtColumn = AbstractWahlartColumn.createWahlartMaxAnzahlErsatzkandidaturenArtColumn(getMessages());
    maxAnzahlErsatzkandidaturenColumn = AbstractWahlartColumn.createWahlartMaxAnzahlErsatzkandidaturenColumn(getMessages());
    maxAnzahlErsatzkandidaturenColumn.setDisplayFilter((wahlart, value) -> {
      if (wahlart.getMaxAnzahlErsatzkandidaturenArt().isAnzahlPerWahlartVorgegeben()) {
        if (wahlart.isWahlMitBeliebigVielenErsatzkandidaturen()) {
          return getMessage(AbstractWahlart.BELIEBIG_VIELE_ERSATZKANDIDATUREN_MSG_KEY);
        }

        return value;
      }

      return null;
    });

    wahlartSitzberechnungsalgorithmusColumn = AbstractWahlartColumn.createWahlartSitzberechnungsalgorithmusColumn(getMessages());

    aOhneWahlscheinVorlaeufigColumn = AbstractWahlartColumn.createWahlartUmgangAOhneWahlscheinVorlaeufigColumn(getMessages());
    aMitWahlscheinVorlaeufigColumn = AbstractWahlartColumn.createWahlartUmgangAMitWahlscheinVorlaeufigColumn(getMessages());
    aNichtImWaehlerverzeichnisVorlaeufigColumn = AbstractWahlartColumn.createWahlartUmgangANichtImWaehlerverzeichnisVorlaeufigColumn(getMessages());
    aGesamtVorlaeufigColumn = AbstractWahlartColumn.createWahlartUmgangAGesamtVorlaeufigColumn(getMessages());

    aOhneWahlscheinEndgueltigColumn = AbstractWahlartColumn.createWahlartUmgangAOhneWahlscheinEndgueltigColumn(getMessages());
    aMitWahlscheinEndgueltigColumn = AbstractWahlartColumn.createWahlartUmgangAMitWahlscheinEndgueltigColumn(getMessages());
    aNichtImWaehlerverzeichnisEndgueltigColumn = AbstractWahlartColumn.createWahlartUmgangANichtImWaehlerverzeichnisEndgueltigColumn(getMessages());
    aGesamtEndgueltigColumn = AbstractWahlartColumn.createWahlartUmgangAGesamtEndgueltigColumn(getMessages());

    bOhneWahlscheinVorlaeufigColumn = AbstractWahlartColumn.createWahlartUmgangBOhneWahlscheinVorlaeufigColumn(getMessages());
    bMitWahlscheinVorlaeufigColumn = AbstractWahlartColumn.createWahlartUmgangBMitWahlscheinVorlaeufigColumn(getMessages());
    bGesamtVorlaeufigColumn = AbstractWahlartColumn.createWahlartUmgangBGesamtVorlaeufigColumn(getMessages());

    bOhneWahlscheinEndgueltigColumn = AbstractWahlartColumn.createWahlartUmgangBOhneWahlscheinEndgueltigColumn(getMessages());
    bMitWahlscheinEndgueltigColumn = AbstractWahlartColumn.createWahlartUmgangBMitWahlscheinEndgueltigColumn(getMessages());
    bGesamtEndgueltigColumn = AbstractWahlartColumn.createWahlartUmgangBGesamtEndgueltigColumn(getMessages());

    wahlartZulassungspruefungColumn = AbstractWahlartColumn.createWahlartZulassungspruefungColumn(getMessages());

    wahlartDokumentvorlagenColumn = AbstractWahlartColumn.createWahlartDokumentvorlagenColumn(getMessages());
  }

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

    result.add(wahlartGebietsartenColumn);
    result.add(wahlartSystemGebietsebeneColumn);

    result.add(anzahlStimmenProWaehlerArtColumn);
    result.add(anzahlStimmenProWaehlerColumn);

    result.add(gruppenreihenfolgeVorgegebenColumn);

    result.add(gruppenvereinigungenErlaubtColumn);
    result.add(leereListenErlaubtColumn);
    result.add(listenverbindungenErlaubtColumn);

    result.add(maxAnzahlNennungenColumn);

    result.add(maxAnzahlErsatzkandidaturenArtColumn);
    result.add(maxAnzahlErsatzkandidaturenColumn);

    result.add(wahlartSitzberechnungsalgorithmusColumn);

    result.add(wahlartZulassungspruefungColumn);

    result.add(aOhneWahlscheinVorlaeufigColumn);
    result.add(aMitWahlscheinVorlaeufigColumn);
    result.add(aNichtImWaehlerverzeichnisVorlaeufigColumn);
    result.add(aGesamtVorlaeufigColumn);

    result.add(aOhneWahlscheinEndgueltigColumn);
    result.add(aMitWahlscheinEndgueltigColumn);
    result.add(aNichtImWaehlerverzeichnisEndgueltigColumn);
    result.add(aGesamtEndgueltigColumn);

    result.add(bOhneWahlscheinVorlaeufigColumn);
    result.add(bMitWahlscheinVorlaeufigColumn);
    result.add(bGesamtVorlaeufigColumn);

    result.add(bOhneWahlscheinEndgueltigColumn);
    result.add(bMitWahlscheinEndgueltigColumn);
    result.add(bGesamtEndgueltigColumn);
    result.add(wahlartDokumentvorlagenColumn);

    return result;
  }
}
