package com.airlock.iam.servicecontainer.app.infrastructure.rememberme;

import com.airlock.iam.base.misc.time.RealTimeProvider;
import com.airlock.iam.base.misc.time.TimeProvider;
import com.airlock.iam.common.application.configuration.rememberme.RememberMeConfig;
import com.airlock.iam.servicecontainer.app.application.configuration.task.rememberme.RememberMeTokenCleanupTaskConfig;
import com.airlock.iam.servicecontainer.app.domain.model.task.rememberme.RememberMeTokenCleanupRepository;
import com.airlock.iam.servicecontainer.app.domain.model.task.rememberme.RememberMeTokenCleanupTask;

public final class RememberMeTokenCleanupTaskFactory {
   public static RememberMeTokenCleanupTask rememberMeTokenCleanupTask(RememberMeTokenCleanupTaskConfig taskConfig) {
      return RememberMeTokenCleanupTask.builder()
         .repository(rememberMeTokenCleanUpRepository(taskConfig, timeProvider()))
         .batchSize(taskConfig.getBatchSize())
         .build();
   }

   private static RememberMeTokenCleanupRepository rememberMeTokenCleanUpRepository(RememberMeTokenCleanupTaskConfig taskConfig, TimeProvider timeProvider) {
      RememberMeConfig config = taskConfig.getRememberMeConfig();
      return new RememberMeTokenCleanupRepositoryImpl(
         config.getRepository().jooqConfig(), timeProvider, config.getRememberMeLifetimeDuration(), config.getRememberMeIdleTimeoutDuration()
      );
   }

   private static TimeProvider timeProvider() {
      return new RealTimeProvider();
   }

   private RememberMeTokenCleanupTaskFactory() {
      throw new AssertionError();
   }
}
