package de.ivu.elect.presentation.mandant;

import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerEdit;
import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.AbstractBenutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.gebietsbaum.boundary.GebietNichtAusgewaehltException;
import de.ivu.elect.business.konfiguration.entity.KonfigurationExtendedLoader;
import de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte;
import de.ivu.elect.business.mandant.boundary.MandantConversationSelect;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.mandant.entity.MandantConstants;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaPasswordProperty;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyLongProperty;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.LambdaEntitySelectOneMenuProperty;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;


import static de.ivu.elect.business.konfiguration.entity.CustomParameterKategorie.AUTHENTIFIZIERUNG;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterWertTyp.STRING;
import static de.ivu.elect.business.konfiguration.entity.MandantKonfigurationArt.CUSTOMER_SYSTEM;
import static de.ivu.elect.business.security.Customer.BASE;

@RequestScoped
@Named(MandantPasswordResetView.COMPONENT_NAME)
@OnlineHilfeId("817")
@View(viewId = MandantPasswordResetView.VIEW_ID, useCase = UseCasePermission.MANDANT_PASSWORD_RESET)
public class MandantPasswordResetView extends AbstractMandantEditNoScopeView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "mandantPasswordResetView";

  public static final String VIEW_ID = "/mandant/mandant-password-reset.xhtml";

  @Inject
  private transient BenutzerExtendedDAO benutzerExtendedDAO;

  @Inject
  private transient KonfigurationExtendedLoader konfigurationExtendedLoader;

  @Inject
  private transient BenutzerEdit benutzerEdit;

  private Benutzer adminUser;

  private String neuesPasswort;

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (getEntity() == null) {
      return getStartViewId();
    }

    return null;
  }

  @Override
  protected String getViewId() {
    return VIEW_ID;
  }

  @Override
  protected void addProperties(FormBuilder formBuilder, Mandant entity) {
    Mandant mandant = getEntity();
    if (mandant != null) {
      List<Benutzer> adminUserList = benutzerExtendedDAO.findByAll(mandant).stream().filter(AbstractBenutzer::isAdmin).collect(Collectors.toList());
      formBuilder.addProperty(new ReadOnlyLongProperty(getMessage(MandantConstants.MESSAGE_KEY_NUMMER_EINZAHL), mandant.getNummer()));
      formBuilder.addProperty(new ReadOnlyStringProperty(getMessage(MandantConstants.MESSAGE_KEY_NAME_EINZAHL), mandant.getName()));
      formBuilder.addProperty(new LambdaEntitySelectOneMenuProperty<>(adminUserList, this::setAdminUser, this::getAdminUser, Benutzer::getBenutzerkennung,
          "mandant.admin.user.label", true, adminUserList.size() != 1));
      formBuilder.addProperty(
          new LambdaPasswordProperty(getMessage("mandant.admin.neues.passwort"), "", true, this::setNeuesPasswort, this::getNeuesPasswort, 1, 255,
              konfigurationExtendedLoader.resolveStringValue(mandant, MandantKonfigurationWerte.LOGIN_SERVICE_PASSWORT_FORMAT_PATTERN),
              konfigurationExtendedLoader.resolveStringValue(mandant, MandantKonfigurationWerte.LOGIN_SERVICE_PASSWORT_FORMAT_BESCHREIBUNG)));
    }
  }

  @Override
  protected void callSave(Mandant entity) {
    benutzerEdit.mandantPasswortReset(getAdminUser(), getNeuesPasswort());
  }

  @Override
  protected void addMessageSaveSuccess(Mandant entity) {
    addInfoMessage("mandant.admin.neues.passwort.success", getAdminUser().getBenutzerkennung(), getEntity().getName(), getEntity().getNummer());
  }

  @Override
  @Redirect
  public String reset() {
    neuesPasswort = null;
    adminUser = null;
    return super.reset();

  }

  public Benutzer getAdminUser() {
    return adminUser;
  }

  public void setAdminUser(Benutzer adminUser) {
    this.adminUser = adminUser;
  }

  public String getNeuesPasswort() {
    return neuesPasswort;
  }

  public void setNeuesPasswort(String neuesPasswort) {
    this.neuesPasswort = neuesPasswort;
  }

  @Override
  protected boolean isGebietBearbeitenRechtPruefen() {
    return false;
  }
}
