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

let redis: Redis | null = null;

export function getRedis(): Redis {
  if (!redis) {
    redis = new Redis(config.redis.url, {
      maxRetriesPerRequest: null,
      enableReadyCheck: false,
      lazyConnect: true,
      retryStrategy: () => null,
    });
    redis.on('error', (err) => {
      console.error('[redis] error:', err.message);
    });
  }
  return redis;
}

export const REDIS_KEYS = {
  firstVisitIp: (ip: string) => `morele:first-visit-ip:${ip}`,
  checkoutStart: (visitorId: string) => `morele:checkout-start:${visitorId}`,
  supportSessionChannel: (sessionId: string) => `morele:support:session:${sessionId}`,
  supportTgMessage: (telegramMessageId: string | number) =>
    `morele:support:tgmsg:${telegramMessageId}`,
  supportBotOffset: 'morele:support:bot-offset',
  visitorCart: (visitorId: string) => `morele:visitor-cart:${visitorId}`,
  cfSession: 'morele:cf:session',
  botWebhook: (orderId: number) => `morele:bot:webhook:${orderId}`,
} as const;

const localTtl = new Map<string, number>();

export async function setOnceWithTtl(key: string, ttlSeconds: number): Promise<boolean> {
  try {
    const result = await getRedis().set(key, '1', 'EX', ttlSeconds, 'NX');
    return result === 'OK';
  } catch {
    const now = Date.now();
    const expiresAt = localTtl.get(key) ?? 0;
    if (expiresAt > now) return false;
    localTtl.set(key, now + ttlSeconds * 1000);
    return true;
  }
}
