package com.airlock.iam.common.infrastructure.state.redis;

import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import org.redisson.api.RedissonClient;

public final class RedisPollingTaskFactory {
   private static final ELogger LOG = ELoggerFactory.getLogger(RedisPollingTaskFactory.class);

   public static RedisPollingTask createPollingTask(RedissonClient client) {
      return new RedisPollingTask(new RedisPollingTaskFactory.LockKeepAliveServiceImpl(new RedisCommandExecutor(() -> client), client));
   }

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

   public record LockKeepAliveServiceImpl(RedisCommandExecutor redisCommandExecutor, RedissonClient client) implements LockKeepAliveService {
      @Override
      public void keepAliveLocks() {
         if (!this.client.isShuttingDown() && !this.client.isShutdown()) {
            this.redisCommandExecutor.keepAliveLocks();
         } else {
            RedisPollingTaskFactory.LOG.debug("Skipping lock keep alive polling as redisson client has been shut down.");
         }
      }
   }
}
