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.common.api.domain.model.phonenumber.PhoneNumber;
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.MtanRegistrationNumberProviderConfig;
import com.airlock.iam.flow.shared.domain.model.mtan.MtanTokenChangeDescription;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(MtanRegistrationNumberProviderConfig.class)
public final class MtanRegistrationNumberProvider implements ValueProvider<String> {
   private final Provider<FlowAttributeService> attributes;
   private final Provider<MtanRegistrationNumberProviderSettings> settings;

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

   public String getValue() {
      Optional<String> number = ((FlowAttributeService)this.attributes.get())
         .findAttribute(MtanTokenChangeDescription.class)
         .flatMap(MtanTokenChangeDescription::getNewPhoneNumber)
         .map(PhoneNumber::getValue);
      if (((MtanRegistrationNumberProviderSettings)this.settings.get()).mandatory() && number.isEmpty()) {
         throw new FailureException("No mTAN Number found in flow session");
      } else {
         return number.orElse(null);
      }
   }
}
