package com.airlock.iam.login.application.service.validity;

import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.common.api.domain.model.user.UserIdentity;
import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.inject.Inject;
import java.util.Optional;

public class UserAuthorizationValidityServiceImpl implements UserAuthorizationValidityService {
   private static final ELogger LOG = ELoggerFactory.getLogger(UserAuthorizationValidityServiceImpl.class);
   private final Optional<UserIdentity> authenticatedUserIdentity;
   private final UserStore userStore;

   @Inject
   public UserAuthorizationValidityServiceImpl(PrincipalInfo principalInfo, UserStore userStore) {
      this.authenticatedUserIdentity = principalInfo.getAuthenticatedIdentity();
      this.userStore = userStore;
   }

   @Override
   public Optional<UserValidityCheckError> checkUserValidity() {
      if (this.authenticatedUserIdentity.isEmpty()) {
         return Optional.empty();
      } else {
         Optional<PersistentUser> user = this.userStore.findByIdentity(this.authenticatedUserIdentity.get().id().getValue());
         if (user.isEmpty()) {
            LOG.debug("Can not check the validate/lock state of a non existing user");
            return Optional.empty();
         } else if (user.get().isLocked()) {
            return Optional.of(UserValidityCheckError.userLocked());
         } else {
            return !user.get().getUserValidity().isValid() ? Optional.of(UserValidityCheckError.userInvalid()) : Optional.empty();
         }
      }
   }
}
