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

import com.airlock.iam.admin.domain.model.session.AdminappSession;
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.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.ws.rs.core.SecurityContext;

public final class AdminAuthPrincipalInfoModule extends PrivateModule {
   @Provides
   @Exposed
   PrincipalInfo providePrincipalInfoImpl(AdminappSession adminappSession, SecurityContext securityContext, TentativePrincipalInfo tentativePrincipalInfo) {
      if (adminappSession.isAuthenticated()) {
         return PrincipalInfoImpl.forAuthenticatedIdentity(adminappSession.getAuthenticatedAdminIdentity().get());
      } else {
         return securityContext.getUserPrincipal() != null
            ? IamSecurityContext.extractPrincipalInfoFromSecurityContext(securityContext)
            : tentativePrincipalInfo.getTentativeIdentity()
               .<PrincipalInfo>map(PrincipalInfoImpl::forTentativeIdentity)
               .orElse(PrincipalInfoImpl.forUnknownIdentity());
      }
   }

   @Provides
   @RequestScoped
   @Exposed
   TentativePrincipalInfo provideTentativePrincipalInfo() {
      return new TentativePrincipalInfo();
   }

   protected void configure() {
   }
}
