from typing import Any, Coroutine

from fastapi import Request, Response, status
from fastapi.responses import JSONResponse
from .blackbox import Blackbox

from .chat import Chat
from .chroma_query import ChromaQuery
from ..log.logging_time import logging_time
import logging

logger = logging.getLogger
DEFAULT_COLLECTION_ID = "123"

from injector import singleton,inject
@singleton
class ChromaChat(Blackbox):

    @inject
    def __init__(self, chat: Chat, chroma_query: ChromaQuery):
        self.chat = chat
        self.chroma_query = chroma_query

    def __call__(self, *args, **kwargs):
        return self.processing(*args, **kwargs)

    def valid(self, *args, **kwargs) -> bool:
        data = args[0]
        return isinstance(data, list)
    
    @logging_time(logger=logger)
    def processing(self, question: str, context: list, settings: dict) -> str:

        # chroma_chat settings
        # {
        #     "chroma_embedding_model": "/model/Weight/BAAI/bge-large-zh-v1.5",
        #     "chroma_host": "10.6.82.192",
        #     "chroma_port": "8000",
        #     "chroma_collection_id": "g2e",
        #     "chroma_n_results": 3,
        #     "model_name": "Qwen1.5-14B-Chat",
        #     "context": [],
        #     "template": "",
        #     "temperature": 0,
        #     "top_p": 0.1,
        #     "n": 1,
        #     "max_tokens": 1024,
        #     "frequency_penalty": 0,
        #     "presence_penalty": 0,
        #     "stop": 100,
        #     "model_url": "http://120.196.116.194:48892/v1/chat/completions",
        #     "model_key": "YOUR_API_KEY"
        # }
        
        if settings is None:
            settings = {}

        user_context = context
        user_question = question

        if user_context == None:
            user_context = []

        if user_question is None:
            return JSONResponse(content={"error": "question is required"}, status_code=status.HTTP_400_BAD_REQUEST)

        # chroma answer
        chroma_result = self.chroma_query(user_question, settings)

        # chat prompt 
        fast_question = f"问题: {user_question}。- 根据知识库内的检索结果，以清晰简洁的表达方式回答问题。只从检索的内容中选取与问题相关信息。- 不要编造答案，如果答案不在经核实的资料中或无法从经核实的资料中得出，请回答“我无法回答您的问题。”检索内容：{chroma_result}"

        # chat answer
        response = self.chat(fast_question, user_context, settings)

        return response


    async def fast_api_handler(self, request: Request) -> Response:
        try:
            data = await request.json()
        except:
            return JSONResponse(content={"error": "json parse error"}, status_code=status.HTTP_400_BAD_REQUEST)

        user_question = data.get("question")
        user_context = data.get("context")
        setting: dict = data.get("settings")

        return JSONResponse(
            content={"response": self.processing(user_question, user_context, setting)}, status_code=status.HTTP_200_OK)