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

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

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

import de.ivu.elect.business.ergebnis.control.StimmenPoolExtendedDAOFactory;
import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.AbstractGebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeImGebietReihenfolgeVorsortierer;
import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturExtendedDAO;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatter;
import de.ivu.elect.business.stimmzettel.boundary.EntityAufStimmzettelDatenStimmzettelPositionBerechnung;
import de.ivu.elect.business.stimmzettel.boundary.EntityAufStimmzettelDatenVorgeladenFactory;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahl.entity.NlWahlCustomData;
import de.ivu.elect.business.wahl.entity.NlWahlPhase;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameterExtendedLoader;
import de.ivu.elect.business.wahlrechtspruefung.boundary.WahlrechtspruefungExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.pruefung.ZulassungPrueferRequestScope;
import de.ivu.elect.presentation.table.AbstractColumnEntry;
import de.ivu.elect.presentation.wahlvorschlag.WahlvorschlagRequestCache;

@Specializes
public class NlGruppeColumnBuilder extends GruppeColumnBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  @Inject
  private transient ListeExtendedDAO listeExtendedDAO;

  @Inject
  private transient WahlvorschlagRequestCache wahlvorschlagRequestCache;

  @Inject
  private transient ZulassungPrueferRequestScope zulassungPrueferRequestScope;

  @Inject
  private transient EntityAufStimmzettelDatenStimmzettelPositionBerechnung entityAufStimmzettelDatenStimmzettelPositionBerechnung;

  @Inject
  private transient StimmenPoolExtendedDAOFactory stimmenPoolExtendedDAOFactory;

  @Inject
  private transient GruppeImGebietReihenfolgeVorsortierer gruppeImGebietReihenfolgeVorsortierer;

  @Inject
  private transient WahlParameterExtendedLoader wahlParameterExtendedLoader;

  @Inject
  private transient StimmzettelFormatter stimmzettelFormatter;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  @Inject
  private transient WahlrechtspruefungExtendedDAO wahlrechtspruefungExtendedDAO;

  @Inject
  private transient ListenkandidaturExtendedDAO listenkandidaturExtendedDAO;

  protected AbstractColumnEntry<Gruppe> gruppeNameKennwortGeaendertColumn;

  protected AbstractColumnEntry<Gruppe> gruppeNameKennwortAbgelehntColumn;

  protected AbstractColumnEntry<Gruppe> gruppeGeschlechtVeroeffentlichenColumn;

  protected AbstractColumnEntry<Gruppe> gruppeListenStelColumn;

  protected AbstractColumnEntry<Gruppe> gruppeWahlkreiseColumn;

  private transient EntityAufStimmzettelDaten entityAufStimmzettelDaten;


  public NlGruppeColumnBuilder() {
    super();
  }

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

    gruppeNameKennwortGeaendertColumn = new NlGruppeNameKennwortGeaendertColumn(getMessages());
    gruppeNameKennwortAbgelehntColumn = new NlGruppeNameKennwortAbgelehntColumn(getMessages()); // ELECT-10164

    gruppeGeschlechtVeroeffentlichenColumn = new NlGeschlechtVeroeffentlichenColumn(getMessages(), listeExtendedDAO);

    gruppeListenStelColumn = new NlGruppeListenStelColumn(getMessages(), listeExtendedDAO, getEntityAufStimmzettelDaten(), listenkandidaturExtendedDAO);
    gruppeWahlkreiseColumn = new NlGruppeWahlkreiseColumn(getMessages(), listeExtendedDAO, getEntityAufStimmzettelDaten(), gebietNummerFormatter,
        wahlrechtspruefungExtendedDAO, listenkandidaturExtendedDAO); // ELECT
    // -10999
  }

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

    result.addAll(getColumnEntriesNamen());
    result.add(gruppeGeschlechtVeroeffentlichenColumn);

    return result;
  }

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

    result.add(gruppeNameKennwortColumn);

    return result;
  }

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

    Wahl wahl = getSelectedWahl();

    if (wahl != null && gebietExtendedDAO.findByWahl(wahl).stream().filter(AbstractGebiet::isListenwahlgebiet).count() > 1) {
      result.add(gruppeListenStelColumn);
      result.add(gruppeWahlkreiseColumn);
    }

    return result;
  }

  protected NlWahlPhase getWahlPhase() {
    Wahl wahl = getSelectedWahl();

    if (wahl == null) {
      return NlWahlPhase.INITIAL;
    }

    return wahl.getCustomData(NlWahlCustomData.class).getNlWahlPhase();
  }

  protected EntityAufStimmzettelDaten getEntityAufStimmzettelDaten() {
    if (entityAufStimmzettelDaten == null) {
      List<Wahlvorschlag> wahlvorschlaegeInWahl = wahlvorschlagRequestCache.getAlleWahlvorschlaege();

      entityAufStimmzettelDaten = new EntityAufStimmzettelDatenVorgeladenFactory(wahlParameterExtendedLoader, zulassungPrueferRequestScope.getZulassungPruefer(), stimmzettelFormatter,
          entityAufStimmzettelDatenStimmzettelPositionBerechnung, stimmenPoolExtendedDAOFactory, gruppeImGebietReihenfolgeVorsortierer, wahlvorschlaegeInWahl).getEntityAufStimmzettelDaten();
    }

    return entityAufStimmzettelDaten;
  }
}
