# Key Sync Service - Redis Client Factory

import redis
import time
from redis.exceptions import ConnectionError, TimeoutError
try:
    from .config import (
        REDIS_HOST, REDIS_PORT, REDIS_PASSWORD,
        REDIS_RECONNECT_DELAY, REDIS_MAX_CONNECTIONS,
        REDIS_SOCKET_TIMEOUT, REDIS_SOCKET_CONNECT_TIMEOUT
    )
except ImportError:
    from config import (
        REDIS_HOST, REDIS_PORT, REDIS_PASSWORD,
        REDIS_RECONNECT_DELAY, REDIS_MAX_CONNECTIONS,
        REDIS_SOCKET_TIMEOUT, REDIS_SOCKET_CONNECT_TIMEOUT
    )

# Cache connection pools theo db number để tái sử dụng
_pools = {}


def _get_pool(db):
    """Lấy hoặc tạo connection pool cho db cụ thể"""
    if db not in _pools:
        _pools[db] = redis.ConnectionPool(
            host=REDIS_HOST,
            port=REDIS_PORT,
            db=db,
            password=REDIS_PASSWORD,
            decode_responses=True,
            max_connections=REDIS_MAX_CONNECTIONS,
            socket_timeout=REDIS_SOCKET_TIMEOUT,
            socket_connect_timeout=REDIS_SOCKET_CONNECT_TIMEOUT,
            retry_on_timeout=True,
        )
    return _pools[db]


def get_redis_connection(db):
    """Lấy kết nối Redis cho db cụ thể, tự retry khi lỗi"""
    try:
        return redis.Redis(connection_pool=_get_pool(db))
    except (ConnectionError, TimeoutError) as e:
        print(f"Lỗi kết nối Redis (db={db}): {e}")
        time.sleep(REDIS_RECONNECT_DELAY)
        return get_redis_connection(db)
