package com.airlock.iam.admin.infrastructure.factory.prot;

import com.airlock.iam.admin.application.service.license.DetachedLicenseValidator;
import com.airlock.iam.admin.application.service.license.LicenseDeployer;
import com.airlock.iam.admin.application.service.license.LicenseService;
import com.airlock.iam.admin.infrastructure.metrics.license.LicenseMetrics;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.core.misc.util.config.ActiveLicenseEnvironment;
import com.airlock.iam.license.application.service.management.DetachedLicenseManager;
import com.airlock.iam.plugin.framework.application.service.license.LicenseManager;
import com.airlock.iam.system.property.IamSystemProperties;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.prometheusmetrics.PrometheusConfig;
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import jakarta.annotation.Nonnull;
import jakarta.inject.Named;
import jakarta.inject.Provider;

public class LicenseServiceModule extends PrivateModule {
   @Provides
   @Exposed
   LicenseService provide(Provider<LicenseManager> manager, @Named("COUNTING_USER_STORE") Provider<UserStore> userStore) {
      return new LicenseService(
         ActiveLicenseEnvironment.activeLicenseFile(),
         (LicenseManager)manager.get(),
         new DetachedLicenseValidator(new DetachedLicenseManager(ActiveLicenseEnvironment.activeInstanceCounter())),
         new LicenseDeployer(),
         (UserStore)userStore.get()
      );
   }

   protected void configure() {
      if (IamSystemProperties.isMetricsEnabled()) {
         this.bind(MeterRegistry.class).toInstance(prometheusMeterRegistry());
         this.bind(LicenseMetrics.class).asEagerSingleton();
      }
   }

   @Nonnull
   private static PrometheusMeterRegistry prometheusMeterRegistry() {
      return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT, PrometheusRegistry.defaultRegistry, Clock.SYSTEM);
   }
}
