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

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.anschrift.boundary.ZusammengesetzteAnschriftFormatter;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.anschrift.table.EntityMitAnschriftColumns;
import de.ivu.elect.presentation.person.table.AbstractPersonendatenColumn;
import de.ivu.elect.presentation.person.table.PersonendatenArtColumn;
import de.ivu.elect.presentation.person.table.PersonendatenBerufColumn;
import de.ivu.elect.presentation.person.table.PersonendatenEhrenamtColumn;
import de.ivu.elect.presentation.person.table.PersonendatenKuenstlernameOrdensnameColumn;
import de.ivu.elect.presentation.person.table.PersonendatenNameVollstaendigAnzeigeColumn;
import de.ivu.elect.presentation.person.table.PersonendatenVornamenAnzeigeColumn;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

public class BasisKandidaturColumnBuilder extends AbstractKandidaturColumnBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ZusammengesetzteAnschriftFormatter zusammengesetzteAnschriftFormatter;

  private AbstractColumnEntry<Kandidatur> kandidaturGebietColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturPolitischeGruppeColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturKandidaturArtColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturStimmzettelPositionColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturAnzahlNennungenColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturStatusColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturPersonStatusColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturNameVollstaendigAnzeigeColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturAkademischerGradColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturTitelColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturFamiliennameBestandteilColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturFamiliennameColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturVornamenColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturGeburtsdatumColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturGeschlechtColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturBerufColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturBerufUnformatiertColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturBerufsschluesselColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturEhrenamtColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturKuenstlernameOrdensnameColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturZusammengesetzteAnschriftColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturStrasseColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturHausnummerColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturHausnummerzusatzColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturWohnungsnummerColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturPlzColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturWohnortColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturOrtsteilColumn;
  private AbstractColumnEntry<Kandidatur> kandidaturZustellanweisungColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturGewaehltVorperiodeColumn;

  private AbstractColumnEntry<Kandidatur> kandidaturVerknuepfungColumn;

  public BasisKandidaturColumnBuilder() {
    super();
  }

  @Override
  public boolean isColumnsSortableByValue() {
    return false;
  }

  @Override
  protected void initColumns() {
    kandidaturGebietColumn = new KandidaturGebietColumn(getMessages());
    kandidaturPolitischeGruppeColumn = new KandidaturPolitischeGruppeColumn(getMessages());

    kandidaturStimmzettelPositionColumn = new KandidaturStimmzettelPositionColumn<>(getMessages(), getIcons(), getSelectedGebiet(), getEntityAufStimmzettelDaten());
    kandidaturAnzahlNennungenColumn = new KandidaturAnzahlNennungenColumn<>(getMessages());

    kandidaturKandidaturArtColumn = new PersonendatenArtColumn<>(getMessages(), getPersonendatenArtFormatter(), "person.typ.kandidatur.header");
    kandidaturStatusColumn = new KandidaturStatusMitIconColumn<>(getMessages(), getIcons(), getEntityAufStimmzettelDaten(), getCurrentWahlZulassungspruefung());
    kandidaturPersonStatusColumn = new KandidaturPersonStatusMitIconColumn<>(getMessages(), getIcons(), getEntityAufStimmzettelDaten(), getCurrentWahlZulassungspruefung());

    kandidaturNameVollstaendigAnzeigeColumn = new KandidaturNameMitIconColumn<>(new PersonendatenNameVollstaendigAnzeigeColumn<>(getMessages(), getPersonendatenFormatter()),
        getWaehlerBenannteKandidaturKonfiguration(), getIcons());
    kandidaturAkademischerGradColumn = AbstractPersonendatenColumn.createPersonendatenAkademischerGradUnformatiertColumn(getMessages());
    kandidaturTitelColumn = AbstractPersonendatenColumn.createPersonendatenTitelColumn(getMessages());
    kandidaturFamiliennameBestandteilColumn = AbstractPersonendatenColumn.createPersonendatenFamiliennameBestandteilColumn(getMessages());
    kandidaturFamiliennameColumn = new KandidaturNameMitIconColumn<>(AbstractPersonendatenColumn.createPersonendatenFamiliennameColumn(getMessages()), getWaehlerBenannteKandidaturKonfiguration(),
        getIcons());
    kandidaturVornamenColumn = new PersonendatenVornamenAnzeigeColumn<>(getMessages(), getPersonendatenFormatter());
    kandidaturGeburtsdatumColumn = AbstractPersonendatenColumn.createPersonendatenGeburtsdatumColumn(getMessages());
    kandidaturGeschlechtColumn = AbstractPersonendatenColumn.createPersonendatenGeschlechtColumn(getMessages());

    kandidaturBerufColumn = new PersonendatenBerufColumn<>(getMessages());
    kandidaturBerufUnformatiertColumn = AbstractPersonendatenColumn.createPersonendatenBerufUnformatiertColumn(getMessages());
    kandidaturBerufsschluesselColumn = AbstractPersonendatenColumn.createPersonendatenBerufsschluesselColumn(getMessages());
    kandidaturEhrenamtColumn = new PersonendatenEhrenamtColumn<>(getMessages());
    kandidaturKuenstlernameOrdensnameColumn = new PersonendatenKuenstlernameOrdensnameColumn<>(getMessages(), getPersonendatenFormatter());

    kandidaturZusammengesetzteAnschriftColumn = new KandidaturZusammengesetzteAnschriftColumn(getMessages(), zusammengesetzteAnschriftFormatter);
    kandidaturStrasseColumn = new EntityMitAnschriftColumns.EntityMitAnschriftStrasseColumn<>(getMessages());
    kandidaturHausnummerColumn = new EntityMitAnschriftColumns.EntityMitAnschriftHausnummerColumn<>(getMessages());
    kandidaturHausnummerzusatzColumn = new EntityMitAnschriftColumns.EntityMitAnschriftHausnummerzusatzColumn<>(getMessages());
    kandidaturWohnungsnummerColumn = new EntityMitAnschriftColumns.EntityMitAnschriftWohnungsnummerColumn<>(getMessages());
    kandidaturPlzColumn = new EntityMitAnschriftColumns.EntityMitAnschriftPlzColumn<>(getMessages());
    kandidaturWohnortColumn = new EntityMitAnschriftColumns.EntityMitAnschriftOrtColumn<>(getMessages());
    kandidaturOrtsteilColumn = new EntityMitAnschriftColumns.EntityMitAnschriftOrtsteilColumn<>(getMessages());
    kandidaturZustellanweisungColumn = new EntityMitAnschriftColumns.EntityMitAnschriftZustellanweisungColumn<>(getMessages());

    kandidaturGewaehltVorperiodeColumn = new KandidaturGewaehltVorperiodeColumn(getMessages());

    kandidaturVerknuepfungColumn = new KandidaturVerknuepfungColumn(getMessages(), getGebietSecurityFilter(), getGebietNummerFormatter());
  }

  @Override
  protected void addColumnEntriesGruppeGebiet(List<ColumnEntry< ? super Kandidatur>> result) {
    // To be overridden...
  }

  @Override
  protected void addColumnEntriesStimmzetteldaten(List<ColumnEntry< ? super Kandidatur>> result) {
    add(result, getKandidaturStimmzettelPositionColumn());
  }

  @Override
  protected void addColumnEntriesKandidaturdaten(List<ColumnEntry< ? super Kandidatur>> result) {
    add(result, getKandidaturStatusColumn(), getKandidaturPersonStatusColumn());
  }

  @Override
  protected void addColumnEntriesPersonendaten(List<ColumnEntry< ? super Kandidatur>> result) {
    add(result, getKandidaturFamiliennameColumn(), getKandidaturVornamenColumn());
  }

  @Override
  protected void addColumnEntriesBeschaeftigungsdaten(List<ColumnEntry< ? super Kandidatur>> result) {
    add(result, getKandidaturBerufColumn());
  }

  @Override
  protected void addColumnEntriesAnschrift(List<ColumnEntry< ? super Kandidatur>> result) {
    // To be overridden...
  }

  @Override
  protected void addColumnEntriesGewaehlt(List<ColumnEntry< ? super Kandidatur>> result) {
    // To be overridden...
  }

  @Override
  protected void addColumnEntriesVerknuepfungen(List<ColumnEntry< ? super Kandidatur>> result) {
    add(result, getKandidaturVerknuepfungColumn()); // ELECT-7364
  }

  @Override
  protected void addColumnEntriesZulassungspruefung(List<ColumnEntry< ? super Kandidatur>> result) {
    // To be overridden...
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturGebietColumn() {
    return kandidaturGebietColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturPolitischeGruppeColumn() {
    return kandidaturPolitischeGruppeColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturKandidaturArtColumn() {
    return kandidaturKandidaturArtColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturStimmzettelPositionColumn() {
    return kandidaturStimmzettelPositionColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturAnzahlNennungenColumn() {
    return kandidaturAnzahlNennungenColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturStatusColumn() {
    return kandidaturStatusColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturPersonStatusColumn() {
    return kandidaturPersonStatusColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturNameVollstaendigAnzeigeColumn() {
    return kandidaturNameVollstaendigAnzeigeColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturAkademischerGradColumn() {
    return kandidaturAkademischerGradColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturTitelColumn() {
    return kandidaturTitelColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturFamiliennameBestandteilColumn() {
    return kandidaturFamiliennameBestandteilColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturFamiliennameColumn() {
    return kandidaturFamiliennameColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturVornamenColumn() {
    return kandidaturVornamenColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturGeburtsdatumColumn() {
    return kandidaturGeburtsdatumColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturGeschlechtColumn() {
    return kandidaturGeschlechtColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturBerufColumn() {
    return kandidaturBerufColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturBerufUnformatiertColumn() {
    return kandidaturBerufUnformatiertColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturBerufsschluesselColumn() {
    return kandidaturBerufsschluesselColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturEhrenamtColumn() {
    return kandidaturEhrenamtColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturKuenstlernameOrdensnameColumn() {
    return kandidaturKuenstlernameOrdensnameColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturZusammengestezteAnschriftColumn() {
    return kandidaturZusammengesetzteAnschriftColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturStrasseColumn() {
    return kandidaturStrasseColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturHausnummerColumn() {
    return kandidaturHausnummerColumn;
  }

  public AbstractColumnEntry<Kandidatur> getKandidaturHausnummerzusatzColumn() {
    return kandidaturHausnummerzusatzColumn;
  }

  public AbstractColumnEntry<Kandidatur> getKandidaturWohnungsnummerColumn() {
    return kandidaturWohnungsnummerColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturPlzColumn() {
    return kandidaturPlzColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturWohnortColumn() {
    return kandidaturWohnortColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturOrtsteilColumn() {
    return kandidaturOrtsteilColumn;
  }

  public AbstractColumnEntry<Kandidatur> getKandidaturZustellanweisungColumn() {
    return kandidaturZustellanweisungColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturGewaehltVorperiodeColumn() {
    return kandidaturGewaehltVorperiodeColumn;
  }

  protected AbstractColumnEntry<Kandidatur> getKandidaturVerknuepfungColumn() {
    return kandidaturVerknuepfungColumn;
  }
}
