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

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

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

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleConstants;
import de.ivu.elect.business.security.boundary.RolleCreator;
import de.ivu.elect.business.security.entity.RolleTemplate;
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(RolleColumnBuilder.COMPONENT_NAME)
public class RolleColumnBuilder extends AbstractColumnBuilder<Rolle> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "rolleColumnBuilder";

  @Inject
  private transient BenutzerExtendedDAO benutzerExtendedDAO;

  @Inject
  private transient RolleCreator rolleCreator;

  private AbstractRolleColumn<Rolle> rolleNameColumn;

  private AbstractRolleColumn<Rolle> rolleBenutzerColumn;

  private AbstractRolleColumn<Rolle> rolleBeschreibungColumn;

  private AbstractRolleColumn<Rolle> rolleArtColumn;

  public RolleColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    rolleNameColumn = AbstractRolleColumn.createRolleNameColumn(getMessages());
    rolleBeschreibungColumn = AbstractRolleColumn.createRolleBeschreibungColumn(getMessages());
    rolleBenutzerColumn = new RolleBenutzerColumn(getMessages(), benutzerExtendedDAO);
    Collection<? extends RolleTemplate> anzulegendeKundenRollen = rolleCreator.getAnzulegendeKundenRollen();
    rolleArtColumn = new AbstractRolleColumn<>("Rolle-RolleArt", getMessages(), RolleConstants.MESSAGE_KEY_ROLLE_ART_EINZAHL,
        ColumnType.STRING, r -> getRolleArtBeschreibung(r, anzulegendeKundenRollen));
  }

  private String getRolleArtBeschreibung(Rolle rolle, Collection<? extends RolleTemplate> anzulegendeKundenRollen) {
    String suffix = "";
    if (rolle.isFachlicheRolle()) {
      if (rolle.isAdminRolle()) {
        suffix += " (" + getMessage("edit.admin.rolle.message") + ")";
      } else if (rolle.isStandardRolle(anzulegendeKundenRollen)) {
        suffix += " (" + getMessage("edit.standard.rolle.message") + ")";
      }
    }
    return getMessage(rolle.getRolleArt()) + suffix;
  }

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

    result.add(rolleNameColumn);
    result.add(rolleArtColumn);
    result.add(rolleBenutzerColumn);
    result.add(rolleBeschreibungColumn);

    return result;
  }
}
