# cache.py 
from functools import lru_cache
from typing import Tuple, Any, Optional,AsyncGenerator, Dict, List 

from config.config import GenerationConfig, ModelConfig


# TODO explain howto use the cache
class ResponseCache:
    def __init__(self, cache_size: int = 1000):
        self.cache_size = cache_size
        self._initialize_cache()

    def _initialize_cache(self):
        @lru_cache(maxsize=self.cache_size)
        def cached_response(prompt: str, config_hash: str) -> Tuple[str, float]:
            pass
        self.get_cached_response = cached_response

    def cache_response(self, prompt: str, config: GenerationConfig, response: str, score: float) -> None:
        config_hash = hash(str(config.__dict__))
        self.get_cached_response(prompt, str(config_hash))
        
    def get_response(self, prompt: str, config: GenerationConfig) -> Optional[Tuple[str, float]]:
        config_hash = hash(str(config.__dict__))
        return self.get_cached_response(prompt, str(config_hash))