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

let _redis: Redis | null = null;
let _redisSub: Redis | null = null;

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

/** Separate connection for pub/sub (cannot run commands while subscribed) */
export function getRedisSub(): Redis {
  if (!_redisSub) {
    _redisSub = new Redis(config.redis.url, {
      maxRetriesPerRequest: null,
      enableReadyCheck: false,
      lazyConnect: true,
    });
    _redisSub.on('error', (err) => {
      console.error('[redis-sub] error:', err.message);
    });
  }
  return _redisSub;
}

export const REDIS_KEYS = {
  session: (id: string) => `session:${id}`,
  cart: (sessionId: string) => `cart:${sessionId}`,
  /** Maps Sinsay frontend= cookie to our sid cart session (survives login). */
  cartFrontendBind: (frontendId: string) => `cart:frontend:${frontendId}`,
  onlineVisitors: 'online:visitors',
  eventChannel: 'proxy:events',
  productViewDedup: (visitorId: string, productId: string) =>
    `product:viewed:${visitorId}:${productId}`,
  productStatsDirty: 'product:stats:dirty',
  productStatsViews: 'product:stats:views',
  productStatsMeta: (productId: string) => `product:stats:meta:${productId}`,
  productStatsUnique: (productId: string) => `product:stats:unique:${productId}`,
  geoip: (ip: string) => `geoip:${ip}`,
  securityBlockedCount: (day: string) => `security:blocked:${day}`,
  securityBlockedSamples: (day: string) => `security:blocked:${day}:samples`,
  supportSessionChannel: (sessionId: string) => `support:session:${sessionId}`,
  supportTgMessage: (telegramMessageId: string | number) => `support:tgmsg:${telegramMessageId}`,
  supportDedup: (sessionId: string, hash: string) => `support:dedup:${sessionId}:${hash}`,
  analyticsOnline: 'analytics:online',
  analyticsLoginAttempts: (ipHash: string) => `analytics:login:${ipHash}`,
  analyticsIdempotency: (key: string) => `analytics:idem:${key}`,
  checkoutDraft: (id: string) => `checkout:draft:${id}`,
  botWebhook: (orderId: number) => `bot:webhook:${orderId}`,
} as const;
