from arclet.alconna import Args
from nonebot.adapters import Bot
from nonebot.permission import SUPERUSER
from nonebot.plugin import PluginMetadata
from nonebot_plugin_alconna import (
    Alconna,
    Arparma,
    At,
    Match,
    Option,
    on_alconna,
    store_true,
)
from nonebot_plugin_session import EventSession

from ...config import ZxpmConfig
from ...enum import PluginType
from ...extra import PluginExtraData
from ...log import logger
from ...rules import admin_check
from ...utils.utils import MessageUtils
from ._data_source import BanManage

__plugin_meta__ = PluginMetadata(
    name="Ban",
    description="你被逮捕了！丢进小黑屋！封禁用户以及群组，屏蔽消息",
    usage="""
    普通管理员
        格式:
        ban [At用户] ?[-t [时长(分钟)]]

        示例:
        ban @用户          : 永久拉黑用户
        ban @用户 -t 100   : 拉黑用户100分钟
        unban @用户        : 从小黑屋中拉出来
    """.strip(),
    extra=PluginExtraData(
        author="HibiKier",
        version="0.1",
        plugin_type=PluginType.SUPER_AND_ADMIN,
        admin_level=ZxpmConfig.zxpm_ban_level,
        superuser_help="""
        超级管理员额外命令
        格式:
        ban [At用户/用户Id] ?[-t [时长]]
        unban --id [idx]  : 通过id来进行unban操作
        ban列表: 获取所有Ban数据

        群组ban列表: 获取群组Ban数据
        用户ban列表: 获取用户Ban数据

        ban列表 -u [用户Id]: 查找指定用户ban数据
        ban列表 -g [群组Id]: 查找指定群组ban数据
        示例:
            ban列表 -u 123456789    : 查找用户123456789的ban数据
            ban列表 -g 123456789    : 查找群组123456789的ban数据

        私聊下:
            示例:
            ban 123456789          : 永久拉黑用户123456789
            ban 123456789 -t 100   : 拉黑用户123456789 100分钟

            ban -g 999999              : 拉黑群组为999999的群组
            ban -g 999999 -t 100       : 拉黑群组为999999的群组 100分钟

            unban 123456789     : 从小黑屋中拉出来
            unban -g 999999     : 将群组9999999从小黑屋中拉出来
        """,
    ).to_dict(),
)


_ban_matcher = on_alconna(
    Alconna(
        "ban",
        Args["user?", [str, At]],
        Option("-g|--group", Args["group_id", str]),
        Option("-t|--time", Args["duration", int]),
    ),
    rule=admin_check(ZxpmConfig.zxpm_ban_level),
    priority=5,
    block=True,
)

_unban_matcher = on_alconna(
    Alconna(
        "unban",
        Args["user?", [str, At]],
        Option("-g|--group", Args["group_id", str]),
        Option("--id", Args["idx", int]),
    ),
    rule=admin_check(ZxpmConfig.zxpm_ban_level),
    priority=5,
    block=True,
)

_status_matcher = on_alconna(
    Alconna(
        "ban列表",
        Option("-u", Args["user_id", str], help_text="查找用户"),
        Option("-g", Args["group_id", str], help_text="查找群组"),
        Option("--user", action=store_true, help_text="过滤用户"),
        Option("--group", action=store_true, help_text="过滤群组"),
    ),
    permission=SUPERUSER,
    priority=1,
    block=True,
)

_status_matcher.shortcut(
    "用户ban列表",
    command="ban列表",
    arguments=["--user"],
    prefix=True,
)

_status_matcher.shortcut(
    "群组ban列表",
    command="ban列表",
    arguments=["--group"],
    prefix=True,
)


@_status_matcher.handle()
async def _(
    arparma: Arparma,
    user_id: Match[str],
    group_id: Match[str],
):
    filter_type = None
    if arparma.find("user"):
        filter_type = "user"
    if arparma.find("group"):
        filter_type = "group"
    _user_id = user_id.result if user_id.available else None
    _group_id = group_id.result if group_id.available else None
    if image := await BanManage.build_ban_image(filter_type, _user_id, _group_id):
        await MessageUtils.build_message(image).finish(reply_to=True)
    else:
        await MessageUtils.build_message("数据为空捏...").finish(reply_to=True)


@_ban_matcher.handle()
async def _(
    bot: Bot,
    session: EventSession,
    arparma: Arparma,
    user: Match[str | At],
    duration: Match[int],
    group_id: Match[str],
):
    user_id = ""
    if not session.id1:
        await MessageUtils.build_message("用户id为空...").finish(reply_to=True)
    if user.available:
        if isinstance(user.result, At):
            user_id = user.result.target
        else:
            if session.id1 not in bot.config.superusers:
                await MessageUtils.build_message("权限不足捏...").finish(reply_to=True)
            user_id = user.result
    _duration = duration.result * 60 if duration.available else -1
    _duration_text = f"{duration.result} 分钟" if duration.available else " 到世界湮灭"
    if (gid := session.id3 or session.id2) and not group_id.available:
        if (
            not user_id
            or user_id == bot.self_id
            and session.id1 not in bot.config.superusers
        ):
            _duration = 0.5
            await MessageUtils.build_message("倒反天罡，小小管理速速退下！").send()
            await BanManage.ban(session.id1, gid, 30, session, True)
            _duration_text = "半 分钟"
            logger.info("尝试ban Bot 反被拿下", arparma.header_result, session=session)
            await MessageUtils.build_message(
                [
                    "对 ",
                    At(flag="user", target=session.id1),
                    " 狠狠惩戒了一番，一脚踢进了小黑屋!"
                    f" 在里面乖乖呆 {_duration_text}吧!",
                ]
            ).finish(reply_to=True)
        await BanManage.ban(
            user_id, gid, _duration, session, session.id1 in bot.config.superusers
        )
        logger.info(
            "管理员Ban",
            arparma.header_result,
            session=session,
            target=f"{gid}:{user_id}",
        )
        await MessageUtils.build_message(
            [
                "对 ",
                (
                    At(flag="user", target=user_id)
                    if isinstance(user.result, At)
                    else user_id
                ),  # type: ignore
                " 狠狠惩戒了一番，一脚踢进了小黑屋!",
                f" 在里面乖乖呆 {_duration_text} 吧!",
            ]
        ).finish(reply_to=True)
    elif session.id1 in bot.config.superusers:
        _group_id = group_id.result if group_id.available else None
        await BanManage.ban(user_id, _group_id, _duration, session, True)
        logger.info(
            "超级用户Ban",
            arparma.header_result,
            session=session,
            target=f"{_group_id}:{user_id}",
        )
        at_msg = user_id or f"群组:{_group_id}"
        await MessageUtils.build_message(
            f"对 {at_msg} 狠狠惩戒了一番，一脚踢进了小黑屋!"
        ).finish(reply_to=True)


@_unban_matcher.handle()
async def _(
    bot: Bot,
    session: EventSession,
    arparma: Arparma,
    user: Match[str | At],
    group_id: Match[str],
    idx: Match[int],
):
    user_id = ""
    _idx = idx.result if idx.available else None
    if user.available:
        if isinstance(user.result, At):
            user_id = user.result.target
        else:
            if session.id1 not in bot.config.superusers:
                await MessageUtils.build_message("权限不足捏...").finish(reply_to=True)
            user_id = user.result
    if gid := session.id3 or session.id2:
        if group_id.available:
            gid = group_id.result
        is_unban, result = await BanManage.unban(
            user_id, gid, session, _idx, session.id1 in bot.config.superusers
        )
        if not is_unban:
            await MessageUtils.build_message(result).finish(reply_to=True)
        logger.info(
            "管理员UnBan",
            arparma.header_result,
            session=session,
            target=f"{gid}:{result}",
        )
        await MessageUtils.build_message(
            [
                "将 ",
                (
                    At(flag="user", target=user_id)
                    if isinstance(user.result, At)
                    else result
                ),  # type: ignore
                " 从黑屋中拉了出来并急救了一下!",
            ]
        ).finish(reply_to=True)
    elif session.id1 in bot.config.superusers:
        _group_id = group_id.result if group_id.available else None
        is_unban, result = await BanManage.unban(
            user_id, _group_id, session, _idx, True
        )
        if not is_unban:
            await MessageUtils.build_message(result).finish(reply_to=True)
        logger.info(
            "超级用户UnBan",
            arparma.header_result,
            session=session,
            target=f"{_group_id}:{user_id}",
        )
        at_msg = user_id or f"群组:{result}"
        await MessageUtils.build_message(
            f"对 {at_msg} 从黑屋中拉了出来并急救了一下!"
        ).finish(reply_to=True)
