import hashlib
import json

import redis


class RedisCacheRepository:
    def __init__(self, redis_url: str):
        self.client = redis.Redis.from_url(redis_url, decode_responses=True)

    @staticmethod
    def _hash(payload: str) -> str:
        return hashlib.sha256(payload.encode('utf-8')).hexdigest()

    def get_json(self, key: str):
        value = self.client.get(key)
        if not value:
            return None
        return json.loads(value)

    def set_json(self, key: str, value, ttl: int) -> None:
        self.client.setex(key, ttl, json.dumps(value, default=str))

    def embedding_key(self, model_name: str, text: str) -> str:
        return f'emb:{model_name}:{self._hash(text)}'

    def retrieval_key(self, tenant_id: str, query: str, tags: list[str], top_k: int, use_keyword: bool) -> str:
        payload = json.dumps({
            'tenant_id': tenant_id,
            'query': query,
            'tags': sorted(tags),
            'top_k': top_k,
            'use_keyword': use_keyword,
        }, sort_keys=True)
        return f'ret:{self._hash(payload)}'
