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

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.flow.api.domain.model.session.MultiFlowScopedFlowAttribute;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Set;

public class OAuth2AuthorizationCodeGrantConsentSessionAttribute implements MultiFlowScopedFlowAttribute<OAuth2AuthorizationCodeGrantConsentSessionAttribute> {
   private static final String SCOPES_KEY = "scopes";
   private final Set<OAuth2Scope> grantedScopes;

   public OAuth2AuthorizationCodeGrantConsentSessionAttribute mergeWith(OAuth2AuthorizationCodeGrantConsentSessionAttribute newAttribute) {
      throw new FailureException("Cannot change consent session attribute during flow.");
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues().put("scopes", OAuth2Scope.convertToScopeNames(this.grantedScopes).stream().toList()).build();
   }

   public static OAuth2AuthorizationCodeGrantConsentSessionAttribute demapify(MapifiedValues values) {
      return new OAuth2AuthorizationCodeGrantConsentSessionAttribute(values.demapifySimpleSet("scopes", name -> OAuth2Scope.of((String)name)));
   }

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2AuthorizationCodeGrantConsentSessionAttribute(Set<OAuth2Scope> grantedScopes) {
      this.grantedScopes = grantedScopes;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<OAuth2Scope> getGrantedScopes() {
      return this.grantedScopes;
   }
}
