package com.airlock.iam.saml2.domain.model.assertion.attribute;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.user.UsernameToPropagate;
import com.airlock.iam.saml2.application.configuration.assertion.attribute.UsernameAttributeConfig;
import com.airlock.iam.saml2.domain.model.assertion.FlowSaml2Attribute;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(UsernameAttributeConfig.class)
public class Saml2UsernameAttributeImpl implements Saml2AttributeProvider {
   private final UsernameAttributeConfig config;
   private final Provider<Optional<UsernameToPropagate>> usernameToPropagate;

   @Inject
   public Saml2UsernameAttributeImpl(UsernameAttributeConfig config, Provider<Optional<UsernameToPropagate>> usernameToPropagate) {
      this.config = config;
      this.usernameToPropagate = usernameToPropagate;
   }

   @Override
   public Optional<FlowSaml2Attribute> getAttribute() {
      return Optional.of(
         new FlowSaml2Attribute(
            this.config.getSamlAttributeName(),
            ((UsernameToPropagate)((Optional)this.usernameToPropagate.get()).orElseThrow(() -> new FailureException("Username to propagate was empty.")))
               .value(),
            this.config.getNameFormat()
         )
      );
   }
}
