package com.airlock.iam.transactionapproval.health.infrastructure.factory;

import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.common.application.configuration.health.ModuleReadinessConfig;
import com.airlock.iam.common.infrastructure.health.ConfigActivationCheck;
import com.airlock.iam.flow.shared.domain.service.MetadataProvider;
import com.airlock.iam.flow.shared.infrastructure.service.NoMetadataProvider;
import com.airlock.iam.health.api.infrastructure.HealthCheck;
import com.airlock.iam.health.infrastructure.service.ModuleReadinessService;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public final class TransactionApprovalHealthInfrastructureModule extends PrivateModule {
   @Provides
   List<HealthCheck> provideHealthChecks(Optional<ModuleReadinessConfig> config, PluginConfigToLogic configToLogic) {
      Stream<ConfigActivationCheck> builtInChecks = Stream.of(new ConfigActivationCheck());
      Stream<HealthCheck> configuredChecks = config.stream().flatMap(c -> c.getChecks().stream().map(configToLogic::getLogic));
      return Stream.concat(builtInChecks, configuredChecks).toList();
   }

   protected void configure() {
      this.bind(ModuleReadinessService.class).in(RequestScoped.class);
      this.expose(ModuleReadinessService.class);
      this.bind(MetadataProvider.class).toInstance(new NoMetadataProvider());
      this.expose(MetadataProvider.class);
   }
}
