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

import com.airlock.iam.admin.application.configuration.analytics.LicenseAnalyticsConfig;
import com.airlock.iam.admin.application.service.analytics.AnalyticsReportingLevel;
import com.airlock.iam.admin.application.service.analytics.AnalyticsSubmissionCondition;
import com.airlock.iam.admin.application.service.analytics.DailyAnalyticsSubmissionCondition;
import com.airlock.iam.admin.application.service.license.ConfigAnalyticsService;
import com.airlock.iam.admin.infrastructure.mapper.analytics.AnalyticsMapper;
import com.airlock.iam.admin.infrastructure.service.analytics.AnalyticsSubmissionService;
import com.airlock.iam.admin.infrastructure.service.analytics.ConfigAnalyticsServiceImpl;
import com.airlock.iam.base.misc.time.TimeProvider;
import com.airlock.iam.common.domain.service.state.StateRepository;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.inject.Provider;
import java.util.Optional;
import org.mapstruct.factory.Mappers;

public class AnalyticsSubmissionServiceModule extends PrivateModule {
   @Provides
   AnalyticsSubmissionCondition provideUsageSubmissionCondition(Provider<StateRepository> stateRepository, Provider<TimeProvider> time) {
      return new DailyAnalyticsSubmissionCondition(stateRepository, time);
   }

   @Provides
   AnalyticsReportingLevel provideAnalyticsReportingLevel(Optional<LicenseAnalyticsConfig> settings) {
      if (settings.isPresent() && settings.get().isAnalyticsPermitted()) {
         return settings.get().isEnableUsageAnalytics() ? AnalyticsReportingLevel.LICENSE_AND_USAGE_DATA : AnalyticsReportingLevel.LICENSE_DATA;
      } else {
         return AnalyticsReportingLevel.DISABLED;
      }
   }

   @Provides
   AnalyticsMapper provideAnalyticsMapper() {
      return (AnalyticsMapper)Mappers.getMapper(AnalyticsMapper.class);
   }

   protected void configure() {
      this.bind(ConfigAnalyticsService.class).to(ConfigAnalyticsServiceImpl.class);
      this.bind(AnalyticsSubmissionService.class);
      this.expose(AnalyticsSubmissionService.class);
   }
}
