package com.airlock.iam.oauth2.infrastructure.event;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.domain.model.event.EventCreationData;
import com.airlock.iam.base.domain.model.event.EventPublisher;
import com.airlock.iam.oauth2.api.domain.model.AuthorizationServerId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.api.domain.model.event.OAuth2ConsentEventFactory;
import com.airlock.iam.oauth2.api.domain.model.event.OAuth2UserConsentEvent;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Set;
import lombok.NonNull;

public class OAuth2ConsentEventFactoryImpl implements OAuth2ConsentEventFactory {
   private final Provider<EventCreationData> creationData;
   private final Provider<EventPublisher> eventPublisher;

   @Inject
   public OAuth2ConsentEventFactoryImpl(@NonNull Provider<EventCreationData> creationData, @NonNull Provider<EventPublisher> eventPublisher) {
      if (creationData == null) {
         throw new NullPointerException("creationData is marked non-null but is null");
      }

      if (eventPublisher == null) {
         throw new NullPointerException("eventPublisher is marked non-null but is null");
      }

      this.creationData = creationData;
      this.eventPublisher = eventPublisher;
   }

   @Override
   public void publishUserConsentEvent(
      UserId iamUserId,
      Set<OAuth2Scope> grantedScopes,
      Set<OAuth2Scope> deniedScopes,
      Set<OAuth2Scope> alwaysGrantedScopes,
      OAuth2ClientId clientId,
      AuthorizationServerId authorizationServerId
   ) {
      OAuth2UserConsentEvent event = new OAuth2UserConsentEventImpl(
         (EventCreationData)this.creationData.get(), iamUserId, grantedScopes, deniedScopes, alwaysGrantedScopes, clientId, authorizationServerId
      );
      ((EventPublisher)this.eventPublisher.get()).publish(event);
   }
}
