# 导入必要的模块
import logging
import os

import openai  # OpenAI API客户端

# 导入自定义的Django模型
from servermanager.models import commands

# 获取当前模块的日志记录器
logger = logging.getLogger(__name__)

# 配置OpenAI API密钥，从环境变量中获取
openai.api_key = os.environ.get('OPENAI_API_KEY')
# 如果设置了HTTP代理，配置OpenAI使用代理
if os.environ.get('HTTP_PROXY'):
    openai.proxy = os.environ.get('HTTP_PROXY')


class ChatGPT:
    """
    ChatGPT API封装类
    提供与OpenAI GPT模型交互的静态方法
    """
    
    @staticmethod
    def chat(prompt):
        """
        与ChatGPT进行对话的静态方法
        
        Args:
            prompt (str): 用户输入的提示词
            
        Returns:
            str: ChatGPT的回复内容，如果出错返回错误信息
        """
        try:
            # 调用OpenAI ChatCompletion API创建对话完成
            completion = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",  # 指定使用gpt-3.5-turbo模型
                messages=[{"role": "user", "content": prompt}]  # 设置对话消息
            )
            # 返回第一个选择中的消息内容
            return completion.choices[0].message.content
        except Exception as e:
            # 记录错误日志
            logger.error(e)
            # 返回用户友好的错误信息
            return "服务器出错了"


class CommandHandler:
    """
    命令处理器类
    用于管理和执行预定义的系统命令
    """
    
    def __init__(self):
        """
        初始化方法
        从数据库加载所有预定义命令
        """
        # 从数据库获取所有命令对象
        self.commands = commands.objects.all()

    def run(self, title):
        """
        运行指定标题的命令
        
        Args:
            title (str): 命令标题
            
        Returns:
            str: 命令执行结果或帮助信息
        """
        # 使用filter和lambda函数查找标题匹配的命令（不区分大小写）
        cmd = list(
            filter(
                lambda x: x.title.upper() == title.upper(),  # 不区分大小写比较
                self.commands))
        
        # 如果找到匹配的命令
        if cmd:
            # 执行找到的第一个命令
            return self.__run_command__(cmd[0].command)
        else:
            # 未找到命令时返回帮助提示
            return "未找到相关命令，请输入helpme获得帮助。"

    def __run_command__(self, cmd):
        """
        私有方法：实际执行系统命令
        
        Args:
            cmd (str): 要执行的系统命令
            
        Returns:
            str: 命令执行结果或错误信息
        """
        try:
            # 使用os.popen执行系统命令并读取输出
            res = os.popen(cmd).read()
            return res
        except BaseException:
            # 捕获所有异常，返回错误信息
            return '命令执行出错!'

    def get_help(self):
        """
        获取所有命令的帮助信息
        
        Returns:
            str: 格式化的命令帮助信息，包含所有命令的标题和描述
        """
        rsp = ''
        # 遍历所有命令，格式化输出
        for cmd in self.commands:
            rsp += '{c}:{d}\n'.format(c=cmd.title, d=cmd.describe)
        return rsp


# 主程序入口
if __name__ == '__main__':
    # 创建ChatGPT实例
    chatbot = ChatGPT()
    # 测试提示词
    prompt = "写一篇1000字关于AI的论文"
    # 调用chat方法并打印结果
    print(chatbot.chat(prompt))