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.valueprovider.ValueProvider;
import com.airlock.iam.common.domain.model.valueprovider.EntryFromMapValueProviderSettings;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.IntegerFromMapValueProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

@LogicForConfig(IntegerFromMapValueProviderConfig.class)
public class IntegerFromMapValueProvider extends EntryFromMapValueProvider implements ValueProvider<Integer> {
   private static final ELogger LOG = ELoggerFactory.getLogger(IntegerFromMapValueProvider.class);

   @Inject
   protected IntegerFromMapValueProvider(Provider<ValueMapProviderList> valueMapProviderList, Provider<EntryFromMapValueProviderSettings> settings) {
      super(valueMapProviderList, settings);
   }

   public Integer getValue() {
      Object unidentified = this.getValueMapEntry();

      return switch (unidentified) {
         case null -> null;
         case Integer number -> number;
         case String str -> this.parseInteger(str);
         default -> throw new FailureException(
            "Cannot convert value with key '" + this.getEntryKey() + "' to a valid integer. Actual type: " + unidentified.getClass().getSimpleName()
         );
      };
   }

   private Integer parseInteger(String str) {
      try {
         return Integer.parseInt(str);
      } catch (NumberFormatException e) {
         LOG.debug(
            "Failed to convert string with key '" + this.getEntryKey() + "' to a valid integer. Provided value: \"" + str + "\", Cause: " + e.getMessage()
         );
         throw new FailureException("String with key '" + this.getEntryKey() + "' is not a valid integer.");
      }
   }
}
