package com.airlock.iam.login.app.infrastructure.event;

import com.airlock.iam.base.api.domain.model.event.DomainEvent;
import com.airlock.iam.common.infrastructure.event.CustomEventDataProvider;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.elog.api.LogTypes;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public final class LoginappCustomEventDataProvider implements CustomEventDataProvider {
   private static final ELogger LOG = ELoggerFactory.getLogger(LoginappCustomEventDataProvider.class);
   private final Provider<List<ValueMapProvider>> valueMapProviders;

   @Inject
   public LoginappCustomEventDataProvider(Provider<List<ValueMapProvider>> valueMapProviders) {
      this.valueMapProviders = valueMapProviders;
   }

   @Override
   public Map<String, Object> provideCustomData(DomainEvent event) {
      Map<String, Object> values = new HashMap<>();
      ((List)this.valueMapProviders.get()).forEach(provider -> values.putAll(provideSafely(provider)));
      return values;
   }

   private static Map<String, Object> provideSafely(ValueMapProvider provider) {
      try {
         return provider.provideValueMap();
      } catch (Exception e) {
         LOG.warn(
            LogTypes.CONFIGURATION_ERROR,
            String.format("Value Map Provider of type %s failed with message \"%s\", returning empty map.", provider.getClass().getSimpleName(), e.getMessage())
         );
         return Collections.emptyMap();
      }
   }
}
