# API wrapper for https://github.com/pengzhile/pandora/blob/master/doc/HTTP-API.md
import uuid
import aiohttp
import asyncio


class Pandora:
    def __init__(
        self,
        api_endpoint: str,
        clientSession: aiohttp.ClientSession,
    ) -> None:
        self.api_endpoint = api_endpoint.rstrip("/")
        self.session = clientSession

    async def __aenter__(self):
        return self

    async def __aexit__(self, exc_type, exc_val, exc_tb):
        await self.session.close()

    async def gen_title(self, data: dict, conversation_id: str) -> None:
        """
        data = {
            "model": "",
            "message_id": "",
        }
        :param data: dict
        :param conversation_id: str
        :return: None
        """
        api_endpoint = (
            self.api_endpoint + f"/api/conversation/gen_title/{conversation_id}"
        )
        async with self.session.post(api_endpoint, json=data) as resp:
            return await resp.json()

    async def talk(self, data: dict) -> None:
        api_endpoint = self.api_endpoint + "/api/conversation/talk"
        """
        data = {
            "prompt": "",
            "model": "",
            "parent_message_id": "",
            "conversation_id": "", # ignore at the first time
            "stream": True,
        }
        :param data: dict
        :return: None
        """
        data["message_id"] = str(uuid.uuid4())
        async with self.session.post(api_endpoint, json=data) as resp:
            return await resp.json()

    async def goon(self, data: dict) -> None:
        """
        data = {
            "model": "",
            "parent_message_id": "",
            "conversation_id": "",
            "stream": True,
        }
        """
        api_endpoint = self.api_endpoint + "/api/conversation/goon"
        async with self.session.post(api_endpoint, json=data) as resp:
            return await resp.json()


async def test():
    model = "text-davinci-002-render-sha-mobile"
    api_endpoint = "http://127.0.0.1:8008"
    async with aiohttp.ClientSession() as session:
        client = Pandora(api_endpoint, session)
    conversation_id = None
    parent_message_id = str(uuid.uuid4())
    first_time = True
    async with client:
        while True:
            prompt = input("BobMaster: ")
            if conversation_id:
                data = {
                    "prompt": prompt,
                    "model": model,
                    "parent_message_id": parent_message_id,
                    "conversation_id": conversation_id,
                    "stream": False,
                }
            else:
                data = {
                    "prompt": prompt,
                    "model": model,
                    "parent_message_id": parent_message_id,
                    "stream": False,
                }
            response = await client.talk(data)
            conversation_id = response["conversation_id"]
            parent_message_id = response["message"]["id"]
            content = response["message"]["content"]["parts"][0]
            print("ChatGPT: " + content + "\n")
            if first_time:
                first_time = False
                data = {
                    "model": model,
                    "message_id": parent_message_id,
                }
                response = await client.gen_title(data, conversation_id)


if __name__ == "__main__":
    asyncio.run(test())