package com.airlock.iam.saml2.domain.model.sp.step;

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.SingleFlowScopedFlowAttribute;
import com.airlock.iam.saml2.domain.model.sp.Saml2SpAssertionAttributes;

public record Saml2IdpInitiatedSsoFlowAttribute(Saml2SpAssertionAttributes attributes)
   implements SingleFlowScopedFlowAttribute<Saml2IdpInitiatedSsoFlowAttribute> {
   private static final String ATTRIBUTES_KEY = "attr";

   public Saml2IdpInitiatedSsoFlowAttribute mergeWith(Saml2IdpInitiatedSsoFlowAttribute newAttribute) {
      throw new FailureException("An IdP-initiated SSO is already in progress. Cannot be overridden.");
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues()
         .put("attr", Saml2SpAssertionAttributesMapificationUtil.mapifySaml2SpAssertionAttributes(this.attributes))
         .build();
   }

   public static Saml2IdpInitiatedSsoFlowAttribute demapify(MapifiedValues values) {
      return new Saml2IdpInitiatedSsoFlowAttribute(values.demapifyValue("attr", Saml2SpAssertionAttributesMapificationUtil::demapifySaml2SpAssertionAttributes));
   }
}
