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

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

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietsarteigenschaftExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsarteigenschaft;
import de.ivu.elect.business.mandant.control.MandantSupport;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

@Named(GebietsarteigenschaftColumnBuilder.COMPONENT_NAME)
public class GebietsarteigenschaftColumnBuilder extends AbstractColumnBuilder<Gebietsarteigenschaft> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "gebietsarteigenschaftColumnBuilder";

  @Inject
  private transient GebietsarteigenschaftExtendedDAO gebietsarteigenschaftExtendedDAO;

  @Inject
  private transient ElectCommonPrincipal electCommonPrincipal;

  @Inject
  private transient MandantSupport mandantSupport;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> wahlartColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> gebietsartColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> briefwahlgebietColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> direktwahlgebietColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> erfassungsgebietColumn;

  // ELECT-8198 private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> ergebnisRelevantColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> listenkandidatenWaehlbarColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> listenwahlgebietColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> referendumgebietColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> wahlgebietColumn;

  private AbstractGebietsarteigenschaftColumn<Gebietsarteigenschaft> wahlartBeiAufteilungColumn;

  public GebietsarteigenschaftColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    wahlartColumn = new GebietsarteigenschaftWahlartColumn(getMessages());
    gebietsartColumn = new GebietsarteigenschaftGebietsartColumn(getMessages(), gebietsarteigenschaftExtendedDAO);
    briefwahlgebietColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftBriefwahlgebietColumn(getMessages());
    direktwahlgebietColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftDirektwahlgebietColumn(getMessages());
    erfassungsgebietColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftErfassungsgebietColumn(getMessages());
    // ELECT-8198 ergebnisRelevantColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftErgebnisRelevantColumn(getMessages());
    listenkandidatenWaehlbarColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftListenkandidatenWaehlbarColumn(getMessages());
    listenwahlgebietColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftListenwahlgebietColumn(getMessages());
    referendumgebietColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftReferendumgebietColumn(getMessages());
    wahlgebietColumn = AbstractGebietsarteigenschaftColumn.createGebietsarteigenschaftWahlgebietColumn(getMessages());

    wahlartBeiAufteilungColumn = AbstractGebietsarteigenschaftColumn.createWahlartBeiAufteilungColumn(getMessages(), ColumnType.STRING, gae -> {
      Wahlart wahlartBeiAufteilung = gebietsarteigenschaftExtendedDAO.attach(gae).getWahlartBeiAufteilung();
      if (wahlartBeiAufteilung == null) {
        return null;
      }
      return wahlartBeiAufteilung.getNameGuiEindeutig();
    });
  }

  @Override
  protected List<ColumnEntry< ? super Gebietsarteigenschaft>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super Gebietsarteigenschaft>> result = new ArrayList<>();
    result.add(wahlartColumn);
    result.add(gebietsartColumn);
    result.add(wahlgebietColumn);
    // ELECT-8198 result.add(ergebnisRelevantColumn);
    result.add(erfassungsgebietColumn);
    result.add(briefwahlgebietColumn);
    result.add(direktwahlgebietColumn);
    result.add(listenwahlgebietColumn);
    result.add(referendumgebietColumn);
    result.add(listenkandidatenWaehlbarColumn);

    if (electCommonPrincipal.hasUseCasePermission(UseCasePermission.WAHL_FUER_SUBSYSTEME_KONFIGURIEREN) && mandantSupport.isMandantenUnterstuetzt()) {
      result.add(wahlartBeiAufteilungColumn);
    }
    return result;
  }
}
