
package de.ivu.elect.business.benutzerverwaltung.control;

import javax.inject.Inject;
import javax.validation.ValidationException;

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.NonUniqueBenutzerUKException;
import de.ivu.elect.business.benutzerverwaltung.entity.UniqueBenutzerUKValidator;
import de.ivu.elect.business.mandant.boundary.MandantDAO;
import de.ivu.elect.business.security.control.PasswordEncryptionServiceFinder;

public class BenutzerCreate extends AbstractBenutzerCreate {

  @Inject
  private transient UniqueBenutzerUKValidator uniqueBenutzerUKValidator;

  @Inject
  private transient PasswordEncryptionServiceFinder passwordEncryptionServiceFinder;

  @Inject
  private transient BenutzerParameterCreator benutzerParameterCreator;

  @Inject
  private transient MandantDAO mandantDAO;

  public BenutzerCreate() {
    super();
  }

  @Override
  public void save(Benutzer entity) {
    assertUniqueBenutzerTk(entity);

    assertPassword(entity);

    encryptPassword(entity);

    saveMitEinstellungen(entity);
  }

  public void saveMitEinstellungen(Benutzer entity) {
    entity.setMandant(mandantDAO.attach(entity.getMandant()));
    super.save(entity);
    benutzerParameterCreator.initBenutzerParameters(entity);
  }

  private void assertUniqueBenutzerTk(Benutzer entity) {
    if (!isUniqueBenutzerUK(entity)) {
      throw new NonUniqueBenutzerUKException(entity.getBenutzerUK());
    }
  }

  private void assertPassword(Benutzer entity) {
    if (!entity.hasPasswortToEncrypt()) {
      throw new ValidationException("Das Passwort darf nicht leer sein!");
    }
  }

  protected boolean isUniqueBenutzerUK(Benutzer entity) {
    return uniqueBenutzerUKValidator.isUniqueBenutzerUK(entity);
  }

  protected void encryptPassword(Benutzer entity) {
    entity.setPasswort(passwordEncryptionServiceFinder.getDefaultPasswordEncryptionService(), entity.getPasswortToEncrypt());
  }
}
