import redis.asyncio as redis

from shared.config import settings

# Redis connection
redis_client = redis.from_url(settings.REDIS_URL)


class CacheService:
    @staticmethod
    async def set(key: str, value: str, expire: int = 3600):
        """Set cache with expiration"""
        await redis_client.set(key, value, ex=expire)

    @staticmethod
    async def get(key: str) -> str:
        """Get cache value"""
        return await redis_client.get(key)

    @staticmethod
    async def delete(key: str):
        """Delete cache key"""
        await redis_client.delete(key)

    @staticmethod
    async def exists(key: str) -> bool:
        """Check if key exists"""
        return await redis_client.exists(key)

    @staticmethod
    async def set_location(
        user_id: int, latitude: float, longitude: float, expire: int = 300
    ):
        """Cache user location with expiration (5 minutes default)"""
        location_data = f"{latitude},{longitude}"
        await redis_client.set(f"location:{user_id}", location_data, ex=expire)

    @staticmethod
    async def get_location(user_id: int) -> tuple[float, float] | None:
        """Get cached user location"""
        location_data = await redis_client.get(f"location:{user_id}")
        if location_data:
            lat, lng = location_data.decode().split(",")
            return float(lat), float(lng)
        return None
