from langchain_core.retrievers import BaseRetriever
from langchain.schema.document import Document
from langchain_core.callbacks.manager import CallbackManagerForRetrieverRun

from qwin_chat_bot_domain import extract_parse_json
from qdrant import QwinQdrantClient
from db import QwinCasinoDao
from casino_game_info_provider import CasinoGameInfoProvider
from player_game_info_provider import PlayerGameInfoProvider

class GamesRetriever(BaseRetriever):
    casino_game_info_provider: CasinoGameInfoProvider
    player_game_info_provider: PlayerGameInfoProvider

    def _get_relevant_documents(self, query_str: str, run_manager: CallbackManagerForRetrieverRun) -> [Document]:
        query = extract_parse_json(query_str)
        
        if query['game_played']:
            return self.player_game_info_provider.game_summary(query)    
        
        else:
            return self.casino_game_info_provider.game_info(query)
   
def create_games_retriever(user_id: str) -> GamesRetriever:
    qdrant = QwinQdrantClient()
    db = QwinCasinoDao()
    
    casino_game_info_provider = CasinoGameInfoProvider(user_id=user_id, qdrant=qdrant)
    player_game_info_provider = PlayerGameInfoProvider(user_id=user_id, qdrant=qdrant, db=db)

    return GamesRetriever(casino_game_info_provider=casino_game_info_provider,
                          player_game_info_provider=player_game_info_provider
    )
        
        
    
        