package com.airlock.iam.oauth2.infrastructure.service.reporting;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import jakarta.inject.Inject;
import java.util.Optional;

public final class OAuth2ClientIdProvider {
   private Optional<OAuth2ClientId> providedClientId = Optional.empty();
   private Optional<OAuth2ClientId> authenticatedClientId = Optional.empty();

   public Optional<OAuth2ClientId> getProvidedClientId() {
      return this.providedClientId;
   }

   public void setProvidedClientId(OAuth2ClientId providedClientId) {
      if (this.providedClientId.isPresent() && !this.providedClientId.get().equals(providedClientId)) {
         throw new FailureException("Provided client ID already set");
      }

      this.providedClientId = Optional.of(providedClientId);
   }

   public Optional<OAuth2ClientId> getAuthenticatedClientId() {
      return this.authenticatedClientId;
   }

   public void completeSuccessfulAuthentication() {
      if (this.authenticatedClientId.isPresent()) {
         throw new FailureException("Authenticated client ID already set");
      }

      if (this.providedClientId.isEmpty()) {
         throw new FailureException("No provided client ID set");
      }

      this.authenticatedClientId = this.providedClientId;
   }
}
