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

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

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

import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagConversationSelect;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.WahlvorschlagsPersonPruefer;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.person.PersonendatenFormatter;
import de.ivu.elect.presentation.person.table.AbstractPersonendatenColumn;
import de.ivu.elect.presentation.person.table.PersonendatenPersonStatusMitIconColumn;

@Named(WahlvorschlagsPersonColumnBuilder.COMPONENT_NAME)
public class WahlvorschlagsPersonColumnBuilder extends AbstractWahlvorschlagsPersonColumnBuilder {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlvorschlagsPersonColumnBuilder";

  @Inject
  private transient WahlvorschlagConversationSelect wahlvorschlagSelect;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  @Inject
  protected transient WahlvorschlagsPersonPruefer wahlvorschlagsPersonPruefer;

  @Inject
  private transient PersonendatenFormatter personendatenFormatter;

  protected AbstractPersonendatenColumn<WahlvorschlagsPerson> wahlvorschlagsPersonPersonStatusColumn;

  protected WahlvorschlagsPersonWahlvorschlagGebietColumn<WahlvorschlagsPerson> wahlvorschlagsPersonWahlvorschlagGebietColumn;

  protected WahlvorschlagsPersonTypColumn<WahlvorschlagsPerson> wahlvorschlagsPersonTypColumn;

  protected AbstractWahlvorschlagsPersonColumn<WahlvorschlagsPerson> wahlvorschlagsPersonEingangssequenznummerColumn;

  protected WahlvorschlagsPersonWahlvorschlagNameColumn<WahlvorschlagsPerson> wahlvorschlagsPersonWahlvorschlagNameColumn;

  protected WahlvorschlagsPersonKandidaturNameColumn<WahlvorschlagsPerson> wahlvorschlagsPersonKandidaturNameColumn;

  protected WahlvorschlagsPersonKontaktdatenColumn<WahlvorschlagsPerson> wahlvorschlagsPersonWahlvorschlagsPersonKontaktdatenColumn;

  protected WahlvorschlagsPersonAnschriftStrasseHausnummerColumn wahlvorschlagsPersonAnschriftStrasseHausnummerColumn;

  protected WahlvorschlagsPersonAnschriftPlzColumn wahlvorschlagsPersonAnschriftPlzColumn;

  protected WahlvorschlagsPersonAnschriftOrtColumn wahlvorschlagsPersonAnschriftOrtColumn;

  public WahlvorschlagsPersonColumnBuilder() {
    super();
  }

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

    wahlvorschlagsPersonPersonStatusColumn = new PersonendatenPersonStatusMitIconColumn<>(getMessages(), getIcons());

    wahlvorschlagsPersonWahlvorschlagGebietColumn = new WahlvorschlagsPersonWahlvorschlagGebietColumn<>(getMessages());
    wahlvorschlagsPersonWahlvorschlagNameColumn = new WahlvorschlagsPersonWahlvorschlagNameColumn<>(getMessages());
    wahlvorschlagsPersonKandidaturNameColumn = new WahlvorschlagsPersonKandidaturNameColumn<>(getMessages(), personendatenFormatter);

    wahlvorschlagsPersonTypColumn = new WahlvorschlagsPersonTypColumn<>(getMessages());

    wahlvorschlagsPersonEingangssequenznummerColumn = AbstractWahlvorschlagsPersonColumn.createWahlvorschlagsPersonEingangssequenznummerColumn(getMessages());

    wahlvorschlagsPersonWahlvorschlagsPersonKontaktdatenColumn = new WahlvorschlagsPersonKontaktdatenColumn<>(getMessages());

    wahlvorschlagsPersonAnschriftStrasseHausnummerColumn = new WahlvorschlagsPersonAnschriftStrasseHausnummerColumn<>(getMessages());
    wahlvorschlagsPersonAnschriftPlzColumn = new WahlvorschlagsPersonAnschriftPlzColumn<>(getMessages());
    wahlvorschlagsPersonAnschriftOrtColumn = new WahlvorschlagsPersonAnschriftOrtColumn<>(getMessages());
  }

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

    result.add(wahlvorschlagsPersonTypColumn);
    // Unfug hier result.add(wahlvorschlagsPersonEingangssequenznummerColumn);

    result.add(wahlvorschlagsPersonPersonStatusColumn);

    result.add(wahlvorschlagsPersonFamiliennameAnzeigeColumn);
    result.add(wahlvorschlagsPersonVornamenAnzeigeColumn);

    if (!isWahlvorschlagSelected()) {
      if (wahlvorschlagsPersonPruefer.isWahlMitIndividuellenWahlvorschlagsPersonen(getWahlSelected())) {
        result.add(0, wahlvorschlagsPersonKandidaturNameColumn);
      }
      result.add(0, wahlvorschlagsPersonWahlvorschlagNameColumn);
      result.add(0, wahlvorschlagsPersonWahlvorschlagGebietColumn);
    }

    result.add(wahlvorschlagsPersonWahlvorschlagsPersonKontaktdatenColumn);

    result.add(wahlvorschlagsPersonAnschriftStrasseHausnummerColumn);
    result.add(wahlvorschlagsPersonAnschriftPlzColumn);
    result.add(wahlvorschlagsPersonAnschriftOrtColumn);

    return result;
  }

  protected boolean isWahlvorschlagSelected() {
    return wahlvorschlagSelect.isSelected();
  }

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