import re
import json
from pathlib import Path

from nonebot.typing import T_State
from nonebot.permission import SUPERUSER
from nonebot.adapters.cqhttp import Bot, MessageEvent

from ATRI.service import Service as sv
from ATRI.exceptions import ReadFileError, FormatError


ESSENTIAL_DIR = Path('.') / 'ATRI' / 'data' / 'database' / 'essential'


__doc__ = """
查看好友/群申请列表
权限组:维护者
用法:
  查看申请列表
"""

req_list = sv.on_command(
    cmd="申请列表",
    docs=__doc__,
    permission=SUPERUSER
)

@req_list.handle()
async def _req_list(bot: Bot, event: MessageEvent, state: T_State) -> None:
    path_f = ESSENTIAL_DIR / 'request_friend.json'
    path_g = ESSENTIAL_DIR / 'request_group.json'
    data_f, data_g = dict()
    try:
        data_f = json.loads(path_f.read_bytes())
    except ReadFileError:
        msg_f = "[读取文件失败]"
    try:
        data_g = json.loads(path_g.read_bytes())
    except ReadFileError:
        msg_g = "[读取文件失败]"
    
    msg_f = str()
    for i in data_f.keys():
        msg_f += f"{i} | {data_f[i]['user_id']} | {data_f[i]['comment']}\n"

    msg_g = str()
    for i in data_g.keys():
        msg_g += f"{i} | {data_g[i]['sub_type']} | {data_g[i]['user_id']} | {data_g[i]['comment']}\n"
    
    msg = (
        "好友/群申请列表如下:\n"
        "· 好友:\n"
        f"{msg_f}"
        "· 群:\n"
        f"{msg_g}"
    )
    await req_list.finish(msg)


req_deal = sv.on_regex(
    r'[同意|拒绝][好友|群]申请',
    permission=SUPERUSER
)

@req_deal.handle()
async def _req_deal(bot: Bot, event: MessageEvent, state: T_State) -> None:
    msg = str(event.message).split(' ')
    arg = re.findall(r'[同意|拒绝][好友|群]申请', msg[0])
    app = arg[0]
    _type = arg[1]
    
    if not msg[1]:
        await req_deal.finish(f'正确用法!速看\n{app}{_type}申请 (reqid)')
    
    path = ESSENTIAL_DIR / "request_group.json"
    data_g = dict()
    try:
        data_g = json.loads(path.read_bytes())
    except FileExistsError:
        await req_deal.finish("读取群数据失败,可能并没有请求...")
    
    reqid = msg[1]
    if app == "同意":
        if _type == "好友":
            try:
                await bot.set_friend_add_request(flag=reqid,
                                                 approve=True)
                await req_deal.finish(f"完成~!已同意申请")
            except FormatError:
                await req_deal.finish('请检查输入的值是否正确——!')
        elif _type == "群":
            try:
                await bot.set_group_add_request(flag=reqid,
                                                sub_type=data_g[reqid]['sub_type'],
                                                approve=True)
                await req_deal.finish(f"完成~!已同意申请")
            except FormatError:
                await req_deal.finish('请检查输入的值是否正确——!')
        else:
            await req_deal.finish('请检查输入的值是否正确——!')
    elif app == "拒绝":
        if _type == "好友":
            try:
                await bot.set_friend_add_request(flag=reqid,
                                                 approve=False)
                await req_deal.finish(f"完成~!已拒绝申请")
            except FormatError:
                await req_deal.finish('请检查输入的值是否正确——!')
        elif _type == "群":
            try:
                await bot.set_group_add_request(flag=reqid,
                                                sub_type=data_g[reqid]['sub_type'],
                                                approve=False)
                await req_deal.finish(f"完成~!已拒绝申请")
            except FormatError:
                await req_deal.finish('请检查输入的值是否正确——!')
        else:
            await req_deal.finish('请检查输入的值是否正确——!')
    else:
        await req_deal.finish('请检查输入的值是否正确——!')