import logging

import openai

import pkg.openai.keymgr
import pkg.utils.context
import pkg.audit.gatherer
from pkg.openai.modelmgr import ModelRequest, create_openai_model_request


class OpenAIInteract:
    """OpenAI 接口封装

    将文字接口和图片接口封装供调用方使用
    """

    key_mgr: pkg.openai.keymgr.KeysManager = None

    audit_mgr: pkg.audit.gatherer.DataGatherer = None

    default_image_api_params = {
        "size": "256x256",
    }

    def __init__(self, api_key: str):

        self.key_mgr = pkg.openai.keymgr.KeysManager(api_key)
        self.audit_mgr = pkg.audit.gatherer.DataGatherer()

        logging.info("文字总使用量：%d", self.audit_mgr.get_total_text_length())

        openai.api_key = self.key_mgr.get_using_key()

        pkg.utils.context.set_openai_manager(self)

    # 请求OpenAI Completion
    def request_completion(self, prompts) -> tuple[str, int]:
        """请求补全接口回复

        Parameters:
            prompts (str): 提示语

        Returns:
            str: 回复
        """

        config = pkg.utils.context.get_config()

        # 根据模型选择使用的接口
        ai: ModelRequest = create_openai_model_request(
            config.completion_api_params['model'],
            'user',
            config.openai_config["http_proxy"] if "http_proxy" in config.openai_config else None
        )
        ai.request(
            prompts,
            **config.completion_api_params
        )
        response = ai.get_response()

        logging.debug("OpenAI response: %s", response)

        # 记录使用量
        current_round_token = 0
        if 'model' in config.completion_api_params:
            self.audit_mgr.report_text_model_usage(config.completion_api_params['model'],
                                                   ai.get_total_tokens())
            current_round_token = ai.get_total_tokens()
        elif 'engine' in config.completion_api_params:
            self.audit_mgr.report_text_model_usage(config.completion_api_params['engine'],
                                                   response['usage']['total_tokens'])
            current_round_token = response['usage']['total_tokens']

        return ai.get_message(), current_round_token

    def request_image(self, prompt) -> dict:
        """请求图片接口回复

        Parameters:
            prompt (str): 提示语

        Returns:
            dict: 响应
        """
        config = pkg.utils.context.get_config()
        params = config.image_api_params

        response = openai.Image.create(
            prompt=prompt,
            n=1,
            **params
        )

        self.audit_mgr.report_image_model_usage(params['size'])

        return response

