"""Redis-backed conversation session manager.

Each user's conversation state is stored in Redis with a TTL.
The state is a simple dict serialized as JSON.
"""
from __future__ import annotations

import json
from typing import Any

import redis.asyncio as aioredis

SESSION_TTL = 600  # 10 minutes
_KEY_PREFIX = "bot:session:"


def _key(telegram_id: int) -> str:
    return f"{_KEY_PREFIX}{telegram_id}"


class SessionManager:
    def __init__(self, redis_client: aioredis.Redis) -> None:
        self._r = redis_client

    async def get(self, telegram_id: int) -> dict[str, Any]:
        raw = await self._r.get(_key(telegram_id))
        if raw is None:
            return {}
        return json.loads(raw)  # type: ignore[no-any-return]

    async def set(self, telegram_id: int, data: dict[str, Any]) -> None:
        await self._r.setex(_key(telegram_id), SESSION_TTL, json.dumps(data))

    async def update(self, telegram_id: int, **kwargs: Any) -> dict[str, Any]:
        data = await self.get(telegram_id)
        data.update(kwargs)
        await self.set(telegram_id, data)
        return data

    async def clear(self, telegram_id: int) -> None:
        await self._r.delete(_key(telegram_id))

    async def get_field(self, telegram_id: int, field: str, default: Any = None) -> Any:
        data = await self.get(telegram_id)
        return data.get(field, default)
