import { Redis } from "ioredis";
import { env } from "../config/env.js";

/**
 * Cliente Redis (ioredis) compartilhado. O servidor Redis vive no host4
 * (não neste container). Usamos `lazyConnect` para só abrir a conexão
 * quando o primeiro comando rodar — assim importar este módulo não
 * derruba processos que ainda não precisam do Redis.
 *
 * NB: para padrões pub/sub ou comandos bloqueantes (BRPOP) crie conexões
 * dedicadas com `redis.duplicate()` — não reutilize esta instância.
 */

export const redis = new Redis(env.REDIS_URL, {
  lazyConnect: true,
  maxRetriesPerRequest: 3,
  enableReadyCheck: true,
});

// Loga erros sem derrubar o processo (reconexão é automática no ioredis).
redis.on("error", (err: Error) => {
  console.error("[redis] erro de conexão:", err.message);
});

/** Health-check: `PING` deve responder `PONG`. */
export async function pingRedis(): Promise<void> {
  const reply = await redis.ping();
  if (reply !== "PONG") {
    throw new Error(`Redis respondeu algo inesperado ao PING: ${reply}`);
  }
}

/** Encerra a conexão (graceful shutdown). */
export async function closeRedis(): Promise<void> {
  await redis.quit();
}
