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

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.boundary.RolleExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleByNameComparator;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleConstants;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.LambdaEntitySelectOneMenuProperty;


import static java.util.Collections.emptySet;

@Specializes
public class NlBenutzerViewFormBuilder extends BenutzerViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient RolleExtendedDAO rolleExtendedDAO;

  @Inject
  private transient ElectCommonPrincipal principal;

  public NlBenutzerViewFormBuilder() {
    super();
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Benutzer benutzer) {
    if (benutzer.isPersistent()) {
      formBuilder.addProperty(benutzer.getProperties().getBenutzerkennungProperty()).readonly(); // ELECTVAPP-359
    } else {
      addBenutzerkennungProperty(formBuilder, benutzer); // nicht für NL ausprogrammiert, da Logik dran
    }

    addPasswordProperty(benutzer, formBuilder); // nicht für NL ausprogrammiert, da Logik dran
    addGesperrtProperty(formBuilder, benutzer); // nicht für NL ausprogrammiert, da Logik dran

    if (!Objects.equals(principal.getLogin(), benutzer)) { // ELECTVAPP-1379
      var rollenFuerNl = getPossibleRolles().stream()
          .filter(rolle -> rolle.isFachlicheRolle() && !rolle.isAdminRolle())
          .sorted(new RolleByNameComparator())
          .collect(Collectors.toList());

      formBuilder.addProperty(new LambdaEntitySelectOneMenuProperty<>(rollenFuerNl, rolle -> {
        benutzer.removeAllRolles();

        if (rolle != null) {
          benutzer.addRolle(rolle);

        }
      }, () -> {
        if (benutzer.getRolles().isEmpty()) {
          return null;
        }
        return benutzer.getRolles().iterator().next();
      }, Rolle::getName, RolleConstants.MESSAGE_KEY_ENTITY_EINZAHL, true, true));
    }
  }

  @Override
  protected Set<Rolle> getPossibleRolles() {
    var mandant = getPrincipal().getMandant();

    if (mandant != null) {
      return new HashSet<>(rolleExtendedDAO.findByAll(mandant)); // Bei NL können Anwender mit weniger Rechten Anwender mit mehr Rechten anlegen...
    }

    return emptySet();
  }
}
