package com.airlock.iam.admin.application.service.user;

import com.airlock.iam.base.api.domain.model.validation.GenericError;
import com.airlock.iam.base.api.domain.model.validation.ValidationResult;
import com.airlock.iam.base.api.domain.model.validation.Validator;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import jakarta.inject.Inject;

public class UserAdminServiceChangeUsernameValidator implements Validator<String> {
   private final UserStore userStore;
   private final Validator<String> usernameValidator;

   @Inject
   public UserAdminServiceChangeUsernameValidator(UserStore userStore, Validator<String> usernameValidator) {
      this.userStore = userStore;
      this.usernameValidator = usernameValidator;
   }

   public ValidationResult validate(String username) {
      ValidationResult result = ValidationResult.valid();
      result.mergeWith(this.validateUsername(username));
      result.mergeWith(this.verifyUniqueness(username));
      return result;
   }

   private ValidationResult validateUsername(String username) {
      return this.usernameValidator.validate(username);
   }

   private ValidationResult verifyUniqueness(String username) {
      return this.userStore.findByIdentity(username).isPresent()
         ? ValidationResult.singleError("newUsername", GenericError.NOT_UNIQUE)
         : ValidationResult.valid();
   }
}
