from nonebot.adapters import Bot
from nonebot.plugin import PluginMetadata
from nonebot.rule import to_me
from nonebot_plugin_alconna import (
    Alconna,
    AlconnaQuery,
    Args,
    Match,
    Option,
    Query,
    on_alconna,
    store_true,
)
from nonebot_plugin_uninfo import Uninfo

from zhenxun.builtin_plugins.help._config import GROUP_HELP_PATH, SIMPLE_HELP_IMAGE
from zhenxun.configs.utils import PluginExtraData, RegisterConfig
from zhenxun.services.log import logger
from zhenxun.utils.enum import PluginType
from zhenxun.utils.message import MessageUtils

from ._data_source import create_help_img, get_plugin_help

__plugin_meta__ = PluginMetadata(
    name="帮助",
    description="帮助",
    usage="",
    extra=PluginExtraData(
        author="HibiKier",
        version="0.1",
        plugin_type=PluginType.DEPENDANT,
        is_show=False,
        configs=[
            RegisterConfig(
                key="type",
                value="normal",
                help="帮助图片样式 ['normal', 'HTML', 'zhenxun']",
                default_value="zhenxun",
            )
        ],
    ).to_dict(),
)


_matcher = on_alconna(
    Alconna(
        "功能",
        Args["name?", str],
        Option("-s|--superuser", action=store_true, help_text="超级用户帮助"),
    ),
    aliases={"help", "帮助", "菜单"},
    rule=to_me(),
    priority=1,
    block=True,
)


@_matcher.handle()
async def _(
    bot: Bot,
    name: Match[str],
    session: Uninfo,
    is_superuser: Query[bool] = AlconnaQuery("superuser.value", False),
):
    _is_superuser = is_superuser.result if is_superuser.available else False
    if name.available:
        if _is_superuser and session.user.id not in bot.config.superusers:
            _is_superuser = False
        if result := await get_plugin_help(session.user.id, name.result, _is_superuser):
            await MessageUtils.build_message(result).send(reply_to=True)
        else:
            await MessageUtils.build_message("没有此功能的帮助信息...").send(
                reply_to=True
            )
        logger.info(f"查看帮助详情: {name.result}", "帮助", session=session)
    elif session.group and (gid := session.group.id):
        _image_path = GROUP_HELP_PATH / f"{gid}.png"
        if not _image_path.exists():
            await create_help_img(session, gid)
        await MessageUtils.build_message(_image_path).finish()
    else:
        if not SIMPLE_HELP_IMAGE.exists():
            await create_help_img(session, None)
        await MessageUtils.build_message(SIMPLE_HELP_IMAGE).finish()
