package com.airlock.iam.common.infrastructure.service;

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.principal.UserPrincipal;
import com.airlock.iam.common.domain.model.principal.UserPrincipalImpl;
import com.airlock.iam.common.domain.service.principal.UserPrincipalService;
import com.airlock.iam.core.misc.impl.persistency.SimplePersistentUser;
import jakarta.annotation.Nonnull;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public class VirtualUserPrincipalService implements UserPrincipalService, InternalUserPrincipalService {
   private final Provider<UserPrincipal> userPrincipal;

   @Inject
   public VirtualUserPrincipalService(Provider<UserPrincipal> userPrincipal) {
      this.userPrincipal = userPrincipal;
   }

   @Override
   public UserPrincipal initializePrincipal(UserIdentity userIdentity) {
      UserPrincipalImpl principal = (UserPrincipalImpl)this.userPrincipal.get();
      Optional<PersistentUser> user = virtualUser(userIdentity);
      principal.initialize(userIdentity, user);
      return principal;
   }

   @Nonnull
   private static Optional<PersistentUser> virtualUser(UserIdentity userIdentity) {
      return Optional.of(new SimplePersistentUser(userIdentity.id().getValue(), new String[0]));
   }

   @Override
   public void internalInitialize(UserIdentity userIdentity, UserPrincipalImpl principal) {
      principal.initialize(userIdentity, virtualUser(userIdentity));
   }

   @Override
   public void savePrincipal() {
   }

   @Override
   public void reloadPrincipal() {
   }
}
