package com.airlock.iam.flow.shared.domain.model.valueprovider;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.data.OptionalValue;
import com.airlock.iam.common.api.domain.model.valueprovider.ValueProvider;
import com.airlock.iam.flow.shared.api.domain.service.FlowAttributeService;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.MtanRegistrationLabelProviderConfig;
import com.airlock.iam.flow.shared.domain.model.mtan.MtanTokenChangeDescription;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(MtanRegistrationLabelProviderConfig.class)
public class MtanRegistrationLabelProvider implements ValueProvider<String> {
   private final Provider<FlowAttributeService> attributes;
   private final Provider<MtanRegistrationLabelProviderSettings> settings;

   @Inject
   public MtanRegistrationLabelProvider(Provider<FlowAttributeService> attributes, Provider<MtanRegistrationLabelProviderSettings> settings) {
      this.attributes = attributes;
      this.settings = settings;
   }

   public String getValue() {
      Optional<String> label = ((FlowAttributeService)this.attributes.get())
         .findAttribute(MtanTokenChangeDescription.class)
         .map(MtanTokenChangeDescription::getNewLabel)
         .filter(OptionalValue::hasValue)
         .map(OptionalValue::value);
      if (((MtanRegistrationLabelProviderSettings)this.settings.get()).mandatory() && label.isEmpty()) {
         throw new FailureException("No mTAN label found in flow session");
      } else {
         return label.orElse(null);
      }
   }
}
