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

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
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.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.gebietsbaum.tree.GebietsbaumTreeNodeIconResolver;
import de.ivu.elect.presentation.mandant.MandantNameFormatter;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

// ELECT-3793 Notwendig, weil @Named bei JBoss und Wildfly ab der dritten Vererbungsstufe unterschiedlich notwendig sind...
public class GebietColumnBuilderHelper implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient Messages messages;

  @Inject
  protected transient ElectCommonPrincipal principal;

  @Inject
  protected transient MandantSupport mandantSupport;

  @Inject
  protected transient MandantNameFormatter mandantNameFormatter;

  @Inject
  protected transient GebietsbaumTreeNodeIconResolver gebietsbaumTreeNodeIconResolver;

  @Inject
  protected transient GebietNummerFormatter gebietNummerFormatter;

  protected AbstractColumnEntry<Gebiet> gebietGebietsartNameMitIconColumn;

  protected AbstractColumnEntry<Gebiet> gebietNummerBezirkOderNummerColumn;

  protected AbstractColumnEntry<Gebiet> gebietNameColumn;

  protected AbstractColumnEntry<Gebiet> gebietKuerzelColumn;

  protected AbstractColumnEntry<Gebiet> gebietAbgeleiteteEinsehenRolleColumn;

  protected AbstractColumnEntry<Gebiet> gebietAbgeleiteteBearbeitenRolleColumn;

  protected AbstractColumnEntry<Gebiet> gebietVerantwortlicherMandantColumn;

  public GebietColumnBuilderHelper() {
    super();
  }

  public void initColumns() {
    gebietGebietsartNameMitIconColumn = new GebietGebietsartNameMitIconColumn(messages, gebietsbaumTreeNodeIconResolver);

    gebietNummerBezirkOderNummerColumn = new GebietNummerBezirkOderNummerColumn(messages);
    gebietNameColumn = new GebietNameColumn(messages);
    gebietKuerzelColumn = new GebietKuerzelColumn(messages);

    gebietAbgeleiteteEinsehenRolleColumn = AbstractGebietColumn.createEinsehenRolleColumn(messages, ColumnType.STRING, Gebiet::getRollenNameFuerEinsehen);
    gebietAbgeleiteteBearbeitenRolleColumn = AbstractGebietColumn.createBearbeitenRolleColumn(messages, ColumnType.STRING, Gebiet::getRollenNameFuerBearbeiten);

    if (isVerantworlicherMandantSehen()) {
      gebietVerantwortlicherMandantColumn = AbstractGebietColumn.createVerantwortlicherMandantColumn(messages, ColumnType.COLLECTION,
          gebiet ->gebiet.getVerantwortlicheMandantenAbgeleitet().stream().map(m->mandantNameFormatter.formatiereName(m)).collect(Collectors.toList()));
    }
  }

  public List<ColumnEntry< ? super Gebiet>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super Gebiet>> result = new ArrayList<>();

    addColumnEntriesBasisinformationen(result);

    result.add(gebietAbgeleiteteEinsehenRolleColumn);
    result.add(gebietAbgeleiteteBearbeitenRolleColumn);

    if (isVerantworlicherMandantSehen()) {
      result.add(gebietVerantwortlicherMandantColumn);
    }

    return result;
  }

  protected void addColumnEntriesBasisinformationen(List<ColumnEntry< ? super Gebiet>> result) {
    result.add(gebietGebietsartNameMitIconColumn);
    result.add(gebietNummerBezirkOderNummerColumn);

    addNameColumn(result);

    result.add(gebietKuerzelColumn);
  }

  private boolean isVerantworlicherMandantSehen() {
    return mandantSupport.isMandantenUnterstuetzt() && principal.hasUseCasePermission(UseCasePermission.WAHL_FUER_SUBSYSTEME_KONFIGURIEREN);
  }

  protected void addNameColumn(List<ColumnEntry< ? super Gebiet>> columns) {
    columns.add(gebietNameColumn);
  }
}
