
package de.ivu.elect.presentation.benutzerverwaltung;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

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

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RollePickListProperty;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleTyp;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.security.LoginServiceFactory;
import de.ivu.elect.presentation.benutzerverwaltung.form.BenutzerViewFormBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId("482")
@Named(AbstractBenutzerCreateView.COMPONENT_NAME)
public class BenutzerCreateView extends AbstractBenutzerCreateView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient LoginServiceFactory loginServiceFactory;

  @Inject
  private transient BenutzerViewFormBuilder benutzerViewFormBuilder;

  public BenutzerCreateView() {
    super();
  }

  @PreConditionCheck
  public String checkCondition() {
    Mandant mandant = getMandant(); // ELECT-11763

    if (mandant != null && loginServiceFactory.isBenutzerAnlegenMoeglich(mandant.getNummer())) {
      return null;
    }

    addErrorMessage("benutzer.anlegen.nicht.moeglich");

    return getStartViewId();
  }

  @Override
  protected void setEntity(Benutzer benutzer) {
    benutzer.setMandant(getMandant());

    super.setEntity(benutzer);
  }

  public String getPasswortFormatPattern() {
    return benutzerViewFormBuilder.getPasswortFormatPattern(getMandant());
  }

  public String getPasswortFormatBeschreibung() {
    return benutzerViewFormBuilder.getPasswortFormatBeschreibung(getMandant());
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Benutzer benutzer) {
    benutzerViewFormBuilder.addProperties(formBuilder, benutzer);

    benutzer.setMussPasswortWechseln(); // Neu angelegte Benutzer müssen bei der ersten Anmeldung IMMER ihr Passwort wechseln
  }

  @Override
  protected void callSave(Benutzer benutzer) {
    Map<RolleTyp, RollePickListProperty> rollenPropertiesNachTyp = benutzerViewFormBuilder.getRollenPropertiesNachTyp();

    if (!rollenPropertiesNachTyp.isEmpty()) {
      Set<Rolle> neueRollen = new HashSet<>();

      for (RollePickListProperty rollePickListProperty : rollenPropertiesNachTyp.values()) {
        neueRollen.addAll(rollePickListProperty.getZurgeordneteRollen());
      }

      benutzer.setRollen(neueRollen);
    }

    super.callSave(benutzer);
  }
}
