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

import com.airlock.iam.common.application.configuration.continuation.FlowContinuationRepositoryConfig;
import com.airlock.iam.database.infrastructure.DatabaseType;
import com.airlock.iam.database.infrastructure.JooqConfig;
import com.airlock.iam.database.infrastructure.TenantId;
import com.airlock.iam.servicecontainer.app.application.configuration.task.continuation.FlowContinuationTokenCleanupTaskConfig;
import com.airlock.iam.servicecontainer.app.domain.model.task.continuation.FlowContinuationTokenCleanupRepository;
import com.airlock.iam.servicecontainer.app.domain.model.task.continuation.FlowContinuationTokenCleanupTask;
import java.util.List;

public final class FlowContinuationTokenCleanupTaskFactory {
   public static FlowContinuationTokenCleanupTask flowContinuationTokenCleanupTask(FlowContinuationTokenCleanupTaskConfig taskConfig) {
      return FlowContinuationTokenCleanupTask.builder()
         .repository(flowContinuationTokenCleanupRepository(taskConfig))
         .batchSize(taskConfig.getBatchSize())
         .build();
   }

   private static FlowContinuationTokenCleanupRepository flowContinuationTokenCleanupRepository(FlowContinuationTokenCleanupTaskConfig taskConfig) {
      return new FlowContinuationTokenCleanupRepositoryImpl(jooqConfig(taskConfig.getRepository()), taskConfig.getKeepExpiredTokensDuration());
   }

   private static JooqConfig jooqConfig(FlowContinuationRepositoryConfig config) {
      return new JooqConfig(
         config.getSqlDataSource(),
         config.getSqlDataSource().getDbType(),
         config.getSqlDataSource().getDbType() == DatabaseType.ORACLE ? "flow_continuation_token_seq" : null,
         List.of(),
         config.isLogQueries(),
         TenantId.tenantId(config.getTenantId())
      );
   }

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