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

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.entity.EagerLoadingCollector;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.table.AbstractColumnEntry;
import de.ivu.elect.presentation.wahlvorschlag.table.AbstractWahlvorschlagColumn;
import de.ivu.elect.presentation.wahlvorschlag.table.WahlvorschlagGruppeKurznameColumn;
import de.ivu.elect.presentation.wahlvorschlag.table.WahlvorschlagKurznameColumn;

public class BasisDirektkandidaturColumnBuilder extends AbstractKandidaturColumnBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient BasisKandidaturColumnBuilder basisKandidaturColumnBuilder;

  private AbstractColumnEntry<Kandidatur> direktkandidatKennwortColumn;

  private AbstractColumnEntry<Kandidatur> direktkandidatKurznameColumn;

  private AbstractColumnEntry<Kandidatur> direktkandidatKurznameGruppeColumn;

  private AbstractColumnEntry<Kandidatur> direktkandidatIsEinzelbewerberColumn;

  public BasisDirektkandidaturColumnBuilder() {
    super();
  }

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

    direktkandidatKennwortColumn = convertToDirektkandidaturColumn(AbstractWahlvorschlagColumn.createWahlvorschlagKennwortColumn(getMessages()));
    direktkandidatKurznameColumn = convertToDirektkandidaturColumn(new WahlvorschlagKurznameColumn<>(AbstractWahlvorschlagColumn.createWahlvorschlagKurznameColumn(getMessages())));
    direktkandidatKurznameGruppeColumn = convertToDirektkandidaturColumn(new WahlvorschlagGruppeKurznameColumn<>(getMessages()));

    direktkandidatIsEinzelbewerberColumn = new DirektkandidaturEinzelbewerberColumn(getMessages());
  }

  @Override
  protected void addColumnEntriesGruppeGebiet(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesGruppeGebiet(result);
  }

  @Override
  protected void addColumnEntriesStimmzetteldaten(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesStimmzetteldaten(result);
  }

  @Override
  protected void addColumnEntriesKandidaturdaten(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesKandidaturdaten(result);

    // ELECT-8912
    if (isWahlSelectedMitErsatzkandidaturen()) {
      add(result, getDirektkandidaturKandidaturArtColumn());
    }

    add(result, getDirektkandidatIsEinzelbewerberColumn(), getDirektkandidatKurznameGruppeColumn(), getDirektkandidatKurznameColumn(), getDirektkandidatKennwortColumn());
  }

  @Override
  protected void addColumnEntriesPersonendaten(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesPersonendaten(result);
  }

  @Override
  protected void addColumnEntriesBeschaeftigungsdaten(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesBeschaeftigungsdaten(result);
  }

  @Override
  protected void addColumnEntriesAnschrift(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesAnschrift(result);
  }

  @Override
  protected void addColumnEntriesGewaehlt(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesGewaehlt(result);
  }

  @Override
  protected void addColumnEntriesVerknuepfungen(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesVerknuepfungen(result);
  }

  @Override
  protected void addColumnEntriesZulassungspruefung(List<ColumnEntry< ? super Kandidatur>> result) {
    getBasisKandidaturColumnBuilder().addColumnEntriesZulassungspruefung(result);
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturKandidaturArtColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturKandidaturArtColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidatKennwortColumn() {
    return direktkandidatKennwortColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidatKurznameColumn() {
    return direktkandidatKurznameColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidatKurznameGruppeColumn() {
    return direktkandidatKurznameGruppeColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidatIsEinzelbewerberColumn() {
    return direktkandidatIsEinzelbewerberColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturStatusColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturStatusColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturFamiliennameColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturFamiliennameColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturNameVollstaendigAnzeigeColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturNameVollstaendigAnzeigeColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturAkademischerGradColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturAkademischerGradColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturTitelColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturTitelColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturFamiliennameBestandteilColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturFamiliennameBestandteilColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturVornamenColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturVornamenColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturGeburtsdatumColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturGeburtsdatumColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturGeschlechtColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturGeschlechtColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturBerufColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturBerufColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturBerufUnformatiertColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturBerufUnformatiertColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturBerufsschluesselColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturBerufsschluesselColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturEhrenamtColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturEhrenamtColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturKuenstlernameOrdensnameColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturKuenstlernameOrdensnameColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturZusammengestezteAnschriftColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturZusammengestezteAnschriftColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturStrasseColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturStrasseColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturHausnummerColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturHausnummerColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturHausnummerzusatzColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturHausnummerzusatzColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturWohnungsnummerColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturWohnungsnummerColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturPlzColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturPlzColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturWohnortColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturWohnortColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturOrtsteilColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturOrtsteilColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturZustellanweisungColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturZustellanweisungColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturGewaehltVorperiodeColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturGewaehltVorperiodeColumn();
  }

  protected AbstractColumnEntry<Kandidatur> getDirektkandidaturVerknuepfungColumn() {
    return getBasisKandidaturColumnBuilder().getKandidaturVerknuepfungColumn();
  }

  private BasisKandidaturColumnBuilder getBasisKandidaturColumnBuilder() {
    return basisKandidaturColumnBuilder;
  }

  protected AbstractColumnEntry<Kandidatur> convertToDirektkandidaturColumn(AbstractWahlvorschlagColumn< ? super Wahlvorschlag> column) {
    return new DirektkandidaturWahlvorschlagColumn<>(column);
  }
}
