import redis
from redis.exceptions import RedisError
import logging

from .settings import get_settings

_settings = get_settings()
CACHE_TTL_SECONDS = _settings.cache_ttl_seconds
_cache: redis.Redis | None = None
logger = logging.getLogger(__name__)


def get_cache() -> redis.Redis:
    global _cache
    if _cache is None:
        _cache = redis.Redis(
            host=_settings.redis_host,
            port=_settings.redis_port,
            password=_settings.redis_password or None,
            decode_responses=True,
            socket_connect_timeout=5,
            socket_timeout=5,
        )
    return _cache


def safe_cache_get(cache: redis.Redis, key: str):
    try:
        return cache.get(key)
    except RedisError as exc:
        logger.warning("Cache read failed for %s: %s", key, exc.__class__.__name__)
        return None


def safe_cache_set(cache: redis.Redis, key: str, value, **kwargs) -> bool:
    try:
        cache.set(key, value, **kwargs)
        return True
    except RedisError as exc:
        logger.warning("Cache write failed for %s: %s", key, exc.__class__.__name__)
        return False


def safe_cache_delete(cache: redis.Redis, *keys: str) -> bool:
    if not keys:
        return True
    try:
        cache.delete(*keys)
        return True
    except RedisError as exc:
        logger.warning("Cache delete failed for %s: %s", ", ".join(keys), exc.__class__.__name__)
        return False
