package com.airlock.iam.oauth2.domain.model.authorization;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.oauth2.application.configuration.authorization.OpenIdConnectPromptNoneConditionConfig;
import com.airlock.iam.oauth2.domain.model.codegrant.OAuth2OidcAuthorizationRequestAttributes;
import com.airlock.iam.oauth2.domain.model.codegrant.OpenIdConnectAuthenticationRequestAttributes;
import com.airlock.iam.oauth2.domain.model.codegrant.PromptValue;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;
import java.util.Optional;

@LogicForConfig(OpenIdConnectPromptNoneConditionConfig.class)
public final class OpenIdConnectPromptNoneCondition implements FlowCondition {
   private final Provider<Optional<OAuth2OidcAuthorizationRequestAttributes>> request;

   @Inject
   public OpenIdConnectPromptNoneCondition(Provider<Optional<OAuth2OidcAuthorizationRequestAttributes>> request) {
      this.request = request;
   }

   @Override
   public boolean isFulfilled() {
      if (((Optional)this.request.get()).isPresent()
         && ((Optional)this.request.get()).get() instanceof OpenIdConnectAuthenticationRequestAttributes openIdConnectAttributes) {
         List<PromptValue> prompts = openIdConnectAttributes.prompt();
         return prompts.size() == 1 && prompts.contains(PromptValue.NONE);
      } else {
         return false;
      }
   }

   @Override
   public String displayName() {
      return "OpenID Connect prompt=none";
   }
}
