package com.airlock.iam.techclient.infrastructure.repository;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import jakarta.inject.Inject;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class SupplySingleInstance<T, B extends Supplier<T>> implements Function<Map<Integer, B>, Optional<T>> {
   public Optional<T> apply(Map<Integer, B> map) {
      Collection<B> suppliers = map.values();
      if (suppliers.isEmpty()) {
         return Optional.empty();
      } else if (suppliers.size() == 1) {
         return Optional.of(suppliers.iterator().next().get());
      } else {
         throw new FailureException(
            String.format(
               "Expected to fetch only one instance of type %s from the database. Found instances with IDs: %s.",
               suppliers.iterator().next().getClass().getSimpleName(),
               this.ids(map)
            )
         );
      }
   }

   private String ids(Map<Integer, B> map) {
      return map.keySet().stream().map(String::valueOf).collect(Collectors.joining(", "));
   }
}
