"""Redis cache — graceful degrade. Redis kapalıysa sessizce cache'siz çalışır.

Redis şu an ortamda kapalı olabilir; cache opsiyoneldir, çekirdek akışı bloke etmez.
"""
import logging

import redis.asyncio as aioredis

from app.config import settings

logger = logging.getLogger("flovy")


class RedisCache:
    def __init__(self) -> None:
        self._client: aioredis.Redis | None = None
        self._enabled = True

    def _get_client(self) -> aioredis.Redis | None:
        if not self._enabled:
            return None
        if self._client is None:
            self._client = aioredis.from_url(settings.redis_url, decode_responses=True)
        return self._client

    def _disable(self, exc: Exception) -> None:
        if self._enabled:
            logger.warning("Redis kullanılamıyor, cache devre dışı: %s", exc)
        self._enabled = False

    async def get(self, key: str) -> str | None:
        client = self._get_client()
        if client is None:
            return None
        try:
            return await client.get(key)
        except (aioredis.ConnectionError, OSError) as e:
            self._disable(e)
            return None

    async def setex(self, key: str, ttl: int, value: str) -> None:
        client = self._get_client()
        if client is None:
            return
        try:
            await client.setex(key, ttl, value)
        except (aioredis.ConnectionError, OSError) as e:
            self._disable(e)


cache = RedisCache()
