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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.UserStatisticsValueMapProviderConfig;
import com.airlock.iam.flow.shared.domain.model.user.UserLoginStatistics;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@LogicForConfig(UserStatisticsValueMapProviderConfig.class)
public class UserStatisticsValueMapProvider implements ValueMapProvider {
   private final Provider<Optional<UserLoginStatistics>> userStatistics;

   @Inject
   public UserStatisticsValueMapProvider(Provider<Optional<UserLoginStatistics>> userStatistics) {
      this.userStatistics = userStatistics;
   }

   @Override
   public Map<String, Object> provideValueMap() {
      if (((Optional)this.userStatistics.get()).isEmpty()) {
         return Collections.emptyMap();
      }

      UserLoginStatistics stats = (UserLoginStatistics)((Optional)this.userStatistics.get()).orElseThrow();
      Map<String, Object> map = new HashMap<>();
      stats.getLatestSuccessfulLogin().ifPresent(value -> map.put("latest-successful-login", value));
      stats.getSecondLatestSuccessfulLogin().ifPresent(value -> map.put("second-latest-successful-login", value));
      stats.getFirstLogin().ifPresent(value -> map.put("first-login", value));
      stats.getLatestLoginAttempt().ifPresent(value -> map.put("latest-login-attempt", value));
      stats.getSelfRegistrationDate().ifPresent(value -> map.put("self-registration-date", value));
      stats.getLatestUnlockAttempt().ifPresent(value -> map.put("latest-unlock-attempt", value));
      stats.getLockReason().ifPresent(value -> map.put("lock-reason", value));
      stats.getLockDate().ifPresent(value -> map.put("lock-date", value));
      stats.getValidFrom().ifPresent(value -> map.put("valid-from", value));
      stats.getValidTo().ifPresent(value -> map.put("valid-to", value));
      map.put("total-logins", stats.getTotalLogins());
      map.put("failed-logins", stats.getFailedLogins());
      map.put("unlock-attempts", stats.getUnlockAttempts());
      map.put("self-registered", stats.isSelfRegistered());
      map.put("locked", stats.isLocked());
      map.put("valid", stats.isValid());
      return Map.copyOf(map);
   }
}
