from typing import Awaitable, Callable, Optional, Tuple
from nonebot import get_driver
from .logger import logger
from nonebot.matcher import Matcher
from nonebot.adapters import Bot, Event

from .config import *
from .preset_hub_funcs import check_presethub_connection
from . import utils

from nonebot.plugin import PluginMetadata

from .config import Config

global_config = get_driver().config
# logger.info(config) # 这里可以打印出配置文件的内容

from .openai_func import TextGenerator
from .Extension import load_extensions
from .persistent_data_manager import PersistentDataManager
from .chat_manager import ChatManager
from . import matcher
from . import matcher_MCRcon # noqa: F401


__plugin_meta__ = PluginMetadata(
    name="更更更人性化的GPT-Ai聊天插件",
    description="一个基于NoneBot框架的Ai聊天插件，对接OpenAi文本生成接口，优化了群聊场景的上下文支持。本插件在原版NG的基础上加入了原作者明确不会添加的有用功能。",

    type="application",
    # 发布必填，当前有效类型有：`library`（为其他插件编写提供功能），`application`（向机器人用户提供功能）。

    homepage="https://github.com/Zhou-Shilin/nonebot_plugin_naturel_gpt_plus",
    # 发布必填。

    config=Config,
    # 插件配置项类，如无需配置可不填写。

    supported_adapters={"~onebot.v11"},
    # 支持的适配器集合，其中 `~` 在此处代表前缀 `nonebot.adapters.`，其余适配器亦按此格式填写。
    # 若插件可以保证兼容所有适配器（即仅使用基本适配器功能）可不填写，否则应该列出插件支持的适配器。
)

def set_permission_check_func(callback:Callable[[Matcher, Event, Bot, str, str], Awaitable[Tuple[bool,Optional[str]]]]):
    """设置Matcher的权限检查函数"""
    matcher.permission_check_func = callback

# 设置默认权限检查函数，有需求时可以覆盖
set_permission_check_func(utils.default_permission_check_func)

""" ======== 读取历史记忆数据 ======== """
PersistentDataManager.instance.load_from_file()
ChatManager.instance.create_all_chat_object() # 启动时创建所有的已有Chat对象，以便被 -all 相关指令控制

# 读取ApiKeys
api_keys = config.OPENAI_API_KEYS
logger.info(f"共读取到 {len(api_keys)} 个API Key")

# 检查聊天摘要功能是否开启 未开启则清空所有聊天摘要
if not config.CHAT_ENABLE_SUMMARY_CHAT:
    logger.warning("聊天摘要功能已关闭，将自动清理历史聊天摘要数据")
    ChatManager.instance.clear_all_chat_summary()

""" ======== 初始化对话文本生成器 ======== """
TextGenerator.instance.init(api_keys=api_keys, config={
        'model': config.CHAT_MODEL,
        'max_tokens': config.REPLY_MAX_TOKENS,
        'temperature': config.CHAT_TEMPERATURE,
        'top_p': config.CHAT_TOP_P,
        'frequency_penalty': config.CHAT_FREQUENCY_PENALTY,
        'presence_penalty': config.CHAT_PRESENCE_PENALTY,
        'max_summary_tokens': config.CHAT_MAX_SUMMARY_TOKENS,
        'timeout': config.OPENAI_TIMEOUT,
}, 
proxy=config.OPENAI_PROXY_SERVER if config.OPENAI_PROXY_SERVER else None, # 代理服务器配置
base_url=config.OPENAI_BASE_URL if config.OPENAI_BASE_URL else '', # OpenAI API的base_url
)

""" ======== 加载扩展模块 ======== """
# Extension 模块有作为 __main__ 执行的需求，此时无法加载 class Config, 因此需要传递字典
load_extensions(config.dict())

""" ======== 预设中心连接检查 ======== """
if check_presethub_connection():
    logger.info(f"已连接到预设中心: {config.PRESETHUB_BED_URL}")
else:
    logger.warning("预设中心连接失败，请检查网络连接或预设中心地址是否正确")
