package com.airlock.iam.common.infrastructure.event;

import com.airlock.iam.base.api.domain.model.event.DomainEvent;
import com.airlock.iam.common.api.domain.model.event.UserEvent;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.elog.api.LogTypes;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.Map;

public final class UserStoreEventDataProvider implements CustomEventDataProvider {
   private static final ELogger LOG = ELoggerFactory.getLogger(UserStoreEventDataProvider.class);
   private final Provider<UserStore> userStore;

   @Inject
   public UserStoreEventDataProvider(Provider<UserStore> userStore) {
      this.userStore = userStore;
   }

   @Override
   public Map<String, Object> provideCustomData(DomainEvent event) {
      if (event instanceof UserEvent userEvent) {
         try {
            return ((UserStore)this.userStore.get()).findByIdentity(userEvent.userId()).map(PersistentUser::getContextData).orElseGet(Collections::emptyMap);
         } catch (Exception e) {
            LOG.warn(LogTypes.DATABASE_ACCESS, "Failed to retrieve user context data: " + e.getMessage());
            return Collections.emptyMap();
         }
      } else {
         return Collections.emptyMap();
      }
   }
}
