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

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
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.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerProperties;
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.benutzerverwaltung.entity.RolleTyp;
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;

  @Override
  public void addProperties(FormBuilder formBuilder, Benutzer benutzer) {
    BenutzerProperties benutzerProperties = benutzer.getProperties();
    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

    List<Rolle> rollenFuerNl = new ArrayList<>();
    for (Rolle rolle : getPossibleRolles()) {
      RolleTyp key = RolleTyp.valuePotentiell(rolle, rolleDao);
      if (key != null && key.isFachlich() && !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() {
    return new HashSet<>(rolleExtendedDAO.findByAll(getPrincipal().getMandant())); // Bei NL können Anwender mit weniger Rechten Anwender mit mehr Rechten
    // anlegen
  }
}
