import json
import logging
import redis
from typing import Any, Optional
from app.config.config import settings

logger = logging.getLogger(__name__)

class CacheService:
    def __init__(self):
        try:
            self.client = redis.Redis(
                host=settings.REDIS_HOST,
                port=settings.REDIS_PORT,
                db=settings.REDIS_DB,
                socket_timeout=2.0,
                decode_responses=True
            )
            self.is_connected = self.client.ping()
        except Exception as e:
            logger.warning(f"Failed to connect to Redis. Caching is disabled. Error: {e}")
            self.client = None
            self.is_connected = False

    def get(self, key: str) -> Optional[Any]:
        if not self.is_connected or not self.client:
            return None
        try:
            val = self.client.get(key)
            return json.loads(val) if val else None
        except Exception as e:
            logger.error(f"Redis GET failed: {e}")
            return None

    def set(self, key: str, value: Any, ttl: int = None) -> bool:
        if not self.is_connected or not self.client:
            return False
        if ttl is None:
            ttl = settings.REDIS_CACHE_TTL_SECONDS
        try:
            self.client.setex(key, ttl, json.dumps(value))
            return True
        except Exception as e:
            logger.error(f"Redis SET failed: {e}")
            return False

    def invalidate(self, key: str) -> bool:
        if not self.is_connected or not self.client:
            return False
        try:
            self.client.delete(key)
            return True
        except Exception as e:
            logger.error(f"Redis DELETE failed: {e}")
            return False

cache_service = CacheService()
