import Redis from 'ioredis';
import { config } from '../config.js';

// qmanager cache (continuation of node_mysql/queuemanager модели):
// key = `q:${procName}:${hash(params)}` → JSON-ответ.
// Инвалидация — в qmanager/invalidator.ts по changelog'у.

export const redis = new Redis({
  host: config.redis.host,
  port: config.redis.port,
  lazyConnect: true,
  maxRetriesPerRequest: 3,
});

export async function cacheGet(key: string): Promise<unknown | null> {
  const v = await redis.get(key);
  return v == null ? null : JSON.parse(v);
}

export async function cacheSet(key: string, value: unknown, ttlSec = 300): Promise<void> {
  await redis.set(key, JSON.stringify(value), 'EX', ttlSec);
}

export async function cacheDelPattern(pattern: string): Promise<void> {
  const stream = redis.scanStream({ match: pattern, count: 200 });
  for await (const keys of stream) {
    if ((keys as string[]).length) await redis.del(...(keys as string[]));
  }
}

export async function connectRedis(): Promise<void> {
  if (redis.status === 'wait') await redis.connect();
}
