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

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

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

import de.ivu.elect.business.benutzerverwaltung.entity.AngemeldeterBenutzer;
import de.ivu.elect.business.mandant.boundary.MandantExtendedDAO;
import de.ivu.elect.business.mandant.control.MandantSupport;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.mandant.MandantNameFormatter;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;


import static java.util.stream.Collectors.toMap;

@Named(AngemeldeteBenutzerColumnBuilder.COMPONENT_NAME)
public class AngemeldeteBenutzerColumnBuilder extends AbstractColumnBuilder<AngemeldeterBenutzer> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "angemeldeteBenutzerColumnBuilder";

  @Inject
  private transient MandantSupport mandantSupport;

  @Inject
  private MandantSessionSelect mandantSessionSelect;

  @Inject
  private transient MandantExtendedDAO mandantExtendedDAO;

  @Inject
  private transient MandantNameFormatter mandantNameFormatter;

  private AngemeldeterBenutzerIdColumn angemeldeterBenutzerIdColumn;

  private AngemeldeterBenutzerSessionIdColumn angemeldeterBenutzerSessionIdColumn;

  private AngemeldeterBenutzerMandantColumn angemeldeterBenutzerMandantColumn;

  private AngemeldeterBenutzerKennungColumn angemeldeterBenutzerKennungColumn;

  private AngemeldeterBenutzeRollenColumn angemeldeterBenutzeRollenColumn;

  private AngemeldeterBenutzeIPAdresseColumn angemeldeterBenutzeIPAdresseColumn;

  private AngemeldeterBenutzeEinsatzortColumn angemeldeterBenutzeEinsatzortColumn;

  private AngemeldeterBenutzeAnmeldezeitpunktColumn angemeldeterBenutzeAnmeldezeitpunktColumn;

  private AngemeldeterBenutzeZeitpunktLetzteAktionColumn angemeldeterBenutzeZeitpunktLetzteAktionColumn;

  @Override
  protected void initColumns() {
    angemeldeterBenutzerIdColumn = new AngemeldeterBenutzerIdColumn(getMessages());
    angemeldeterBenutzerSessionIdColumn = new AngemeldeterBenutzerSessionIdColumn(getMessages());
    angemeldeterBenutzerMandantColumn = new AngemeldeterBenutzerMandantColumn(getMessages(), mandantNameFormatter,
        mandantExtendedDAO.findByAll().stream().collect(toMap(Mandant::getNummer, Function.identity())));
    angemeldeterBenutzerKennungColumn = new AngemeldeterBenutzerKennungColumn(getMessages());
    angemeldeterBenutzeRollenColumn = new AngemeldeterBenutzeRollenColumn(getMessages());
    angemeldeterBenutzeIPAdresseColumn = new AngemeldeterBenutzeIPAdresseColumn(getMessages());
    angemeldeterBenutzeEinsatzortColumn = new AngemeldeterBenutzeEinsatzortColumn(getMessages());
    angemeldeterBenutzeAnmeldezeitpunktColumn = new AngemeldeterBenutzeAnmeldezeitpunktColumn(getMessages());
    angemeldeterBenutzeZeitpunktLetzteAktionColumn = new AngemeldeterBenutzeZeitpunktLetzteAktionColumn(getMessages());
  }

  @Override
  protected List<ColumnEntry<? super AngemeldeterBenutzer>> getColumnEntriesSorted() {
    List<ColumnEntry<? super AngemeldeterBenutzer>> result = new ArrayList<>();
    result.add(angemeldeterBenutzerIdColumn);
    result.add(angemeldeterBenutzerSessionIdColumn);
    if (mandantSupport.isMandantenUnterstuetzt() && mandantSessionSelect.getMandant() != null && mandantSessionSelect.getMandant().getArt().isSystemMandant()) {
      result.add(angemeldeterBenutzerMandantColumn);
    }
    result.add(angemeldeterBenutzerKennungColumn);
    result.add(angemeldeterBenutzeIPAdresseColumn);
    result.add(angemeldeterBenutzeEinsatzortColumn);
    result.add(angemeldeterBenutzeRollenColumn);
    result.add(angemeldeterBenutzeAnmeldezeitpunktColumn);
    result.add(angemeldeterBenutzeZeitpunktLetzteAktionColumn);
    return result;
  }
}
