/**
 * Redis Provider
 *
 * Provides Redis/Valkey client instance for the application.
 */

import { Logger } from "@nestjs/common";
import type { Provider } from "@nestjs/common";
import Redis from "ioredis";

/**
 * Factory function to create Redis client instance
 */
function createRedisClient(): Redis {
  const logger = new Logger("RedisProvider");
  const valkeyUrl = process.env.VALKEY_URL ?? "redis://localhost:6379";

  logger.log(`Connecting to Valkey at ${valkeyUrl}`);

  const client = new Redis(valkeyUrl, {
    maxRetriesPerRequest: 3,
    retryStrategy: (times) => {
      const delay = Math.min(times * 50, 2000);
      logger.warn(
        `Valkey connection retry attempt ${times.toString()}, waiting ${delay.toString()}ms`
      );
      return delay;
    },
    reconnectOnError: (err) => {
      logger.error("Valkey connection error:", err.message);
      return true;
    },
  });

  client.on("connect", () => {
    logger.log("Connected to Valkey");
  });

  client.on("error", (err) => {
    logger.error("Valkey error:", err.message);
  });

  return client;
}

/**
 * Redis Client Provider
 *
 * Provides a singleton Redis client instance for dependency injection.
 */
export const RedisProvider: Provider = {
  provide: "REDIS_CLIENT",
  useFactory: createRedisClient,
};
