import aiohttp
from log import getlogger

logger = getlogger()


class GPTBOT:
    def __init__(
        self,
        api_endpoint: str,
        session: aiohttp.ClientSession,
    ) -> None:
        self.api_endpoint = api_endpoint
        self.session = session

    async def queryBing(self, payload: dict) -> dict:
        resp = await self.session.post(url=self.api_endpoint, json=payload, timeout=300)
        status_code = resp.status
        if not status_code == 200:
            logger.warning(str(resp.reason))
            raise Exception(str(resp.reason))
        return await resp.json()

    async def queryChatGPT(self, payload: dict) -> dict:
        resp = await self.session.post(url=self.api_endpoint, json=payload, timeout=300)
        status_code = resp.status
        if not status_code == 200:
            logger.warning(str(resp.reason))
            raise Exception(str(resp.reason))
        return await resp.json()


async def test_chatgpt():
    session = aiohttp.ClientSession()
    gptbot = GPTBOT(api_endpoint="http://localhost:3000/conversation", session=session)
    payload = {}
    while True:
        prompt = input("Bob: ")
        payload["message"] = prompt
        payload.update(
            {
                "clientOptions": {
                    "clientToUse": "chatgpt",
                },
            },
        )
        resp = await gptbot.queryChatGPT(payload)
        content = resp["response"]
        payload["conversationId"] = resp["conversationId"]
        payload["parentMessageId"] = resp["messageId"]
        print("GPT: " + content)


async def test_bing():
    session = aiohttp.ClientSession()
    gptbot = GPTBOT(api_endpoint="http://localhost:3000/conversation", session=session)
    payload = {}
    while True:
        prompt = input("Bob: ")
        payload["message"] = prompt
        payload.update(
            {
                "clientOptions": {
                    "clientToUse": "bing",
                },
            },
        )
        resp = await gptbot.queryBing(payload)
        content = "".join(
            [body["text"] for body in resp["details"]["adaptiveCards"][0]["body"]],
        )
        payload["conversationSignature"] = resp["conversationSignature"]
        payload["conversationId"] = resp["conversationId"]
        payload["clientId"] = resp["clientId"]
        payload["invocationId"] = resp["invocationId"]
        print("Bing: " + content)


# if __name__ == "__main__":
# asyncio.run(test_chatgpt())
# asyncio.run(test_bing())