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

import static java.util.Collections.emptySet;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

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

import de.ivu.elect.business.benutzerverwaltung.boundary.RolleExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.*;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.LambdaEntitySelectOneMenuProperty;

@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(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
      List<Rolle> rollenFuerNl = new ArrayList<>();

      for (Rolle rolle : getPossibleRolles()) {
        if (rolle.isFachlicheRolle() && !rolle.isAdminRolle()) {
          rollenFuerNl.add(rolle);
        }
      }

      rollenFuerNl.sort(new RolleByNameComparator());

      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() {
    Mandant 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();
  }
}
