from dataclasses import asdict, dataclass
from typing import List

from pydantic import BaseModel, Field

from enum import Enum

class MessageRole(str, Enum):
    USER = "user"
    BOT = "assistant"

@dataclass
class Message:
    role: str
    content: str

@dataclass
class CompletionRequest:
    messages: List[Message]
    stream: bool = False
    user: str = ""

@dataclass
class Usage:
    prompt_tokens: int
    completion_tokens: int
    total_tokens: int

@dataclass
class CompletionResponse:
    id: str
    object: str
    created: int
    result: str
    need_clear_history: bool
    ban_round: int = 0
    sentence_id: int = 0
    is_end: bool = False
    usage: Usage = None
    is_safe: bool = False
    is_truncated: bool = False

class ErrorResponse(BaseModel):
    error_code: int = Field(...)
    error_msg: str = Field(...)
    id: str = Field(...)

class ErnieBot():
    url: str
    access_token: str
    request: CompletionRequest

    def __init__(self, url: str, access_token: str, request: CompletionRequest):
        self.url = url
        self.access_token = access_token
        self.request = request

    def get_response(self) -> CompletionResponse:

        import requests
        import json

        headers = {'Content-Type': 'application/json'}
        params = {'access_token': self.access_token}
        request_dict =  asdict(self.request)
        response = requests.post(self.url, params=params,data=json.dumps(request_dict), headers=headers)
        # print(response.json())
        try:
            return CompletionResponse(**response.json())
        except Exception as e:
            print(e)
            raise Exception(response.json())
        
def user_message(prompt: str) -> Message:
    return Message(MessageRole.USER, prompt)

def bot_message(prompt: str) -> Message:
    return Message(MessageRole.BOT, prompt)