package com.airlock.iam.admin.infrastructure.factory.prot;

import com.airlock.iam.common.application.authentication.IamSecurityContext;
import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.common.domain.model.user.PrincipalInfoImpl;
import com.airlock.iam.common.domain.model.user.TentativePrincipalInfo;
import com.airlock.iam.common.domain.service.username.AcceptAllUsernameValidationService;
import com.airlock.iam.common.domain.service.username.UsernameValidationService;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.ws.rs.core.SecurityContext;

public final class AdminProtPrincipalInfoModule extends PrivateModule {
   @Provides
   @Exposed
   PrincipalInfo providePrincipalInfoImpl(SecurityContext securityContext, TentativePrincipalInfo tentativePrincipalInfo) {
      return securityContext.getUserPrincipal() != null
         ? IamSecurityContext.extractPrincipalInfoFromSecurityContext(securityContext)
         : tentativePrincipalInfo.getTentativeIdentity()
            .<PrincipalInfo>map(PrincipalInfoImpl::forTentativeIdentity)
            .orElse(PrincipalInfoImpl.forUnknownIdentity());
   }

   @Provides
   @Exposed
   UsernameValidationService provideUsernameValidationService() {
      return new AcceptAllUsernameValidationService();
   }

   protected void configure() {
   }
}
