from re import match, sub


async def handle_bind_message(message: str, game_type: str) -> tuple[str | None, tuple]:
    '''返回值为tuple[gameType, tuple[message, user]]'''
    _cmd_aliases = {'IO': ['io绑定', 'iobind'],
                    'TOP': ['top绑定', 'topbind']}
    # 剔除命令前缀
    for i in _cmd_aliases[game_type]:
        if match(rf'(?i){i}', message):
            message = sub(rf'(?i){i}', '', message)
            message = message.strip()
            break
    else:
        raise ValueError('预期外行为, 请上报GitHub')
    if message == '' or message.isspace():
        return None, ('用户名为空', None)
    return await check_name(message, game_type)


async def handle_stats_query_message(message: str, game_type: str) -> tuple[str | None, tuple]:
    '''返回值为tuple[gameType, tuple[message, user]]'''
    _cmd_aliases = {'IO': ['io查', 'iostats'],
                    'TOS': ['tos查', 'tostats', 'tosstats', '茶服查', '茶服stats'],
                    'TOP': ['top查', 'topstats']}
    _me = [
        '我', '自己', '我等', '卑人', '愚', '老身', '爷', '老娘', '本姑娘', '本大爷', '鄙人', '寡人',
        '小生', '贫僧', '本人', '孤', '吾', '俺', '咱', '私', 'me', '洒家', '在下', '偶', '人家',
        '本小姐', '老夫', '老子', '朕', '本尊', '僕', '拙者', '妾', '儂', '自分', '吾輩', '我輩', '某',
        '己等', '俺等', '此方', '哥', '姐', '劳资', '本宝宝', '余', '本喵',  'watashi',  'i', 'myself',
        'self', 'oneself'
    ]
    # 剔除命令前缀
    for i in _cmd_aliases[game_type]:
        if match(rf'(?i){i}', message):
            message = sub(rf'(?i){i}', '', message)
            message = message.strip()
            break
    if message == '' or message.isspace():
        return None, ('用户名为空', None)
    if message.startswith('[CQ:at,qq='):
        try:
            user = int(str(message).split('[CQ:at,qq=')[1].split(']')[0])
        except ValueError:
            return None, ('QQ号码不合法', None)
        else:
            return 'AT', (None, user)
    elif message in _me:
        # 会不会有人叫本姑娘 本大爷这种或许可以成为id的名字呢
        # TODO: 在判断是否可能是查自己的情况的时候 也去判断是否能成立为一个UserName
        return 'ME', (None, None)
    else:
        return await check_name(message, game_type)


async def check_name(name: str, game_type: str) -> tuple[str | None, tuple]:
    '''返回值为tuple[gameType, tuple[message, user]]'''
    if game_type == 'IO':
        if match(r'^[a-f0-9]{24}$', name):
            return 'ID', (None, name)
        if match(r'^[a-zA-Z0-9_-]{3,16}$', name):
            return 'Name', (None, name.lower())
        return None, ('用户名不合法', None)
    if game_type == 'TOP':
        if match(r'^[a-zA-Z0-9_]{1,16}$', name):
            return 'Name', (None, name)
        return None, ('用户名不合法', None)
    if game_type == 'TOS':
        if (match(r'^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\-][^\+][^\|\*\?\\\s\!:<>/$"]*[^\.\|\*\?\\\s\!:<>/$"]+$', name)
            and name.isdigit() is False
                and 2 <= len(name) <= 18):
            # 虽然我也不想这么长 但是似乎确实得这么长
            # TODO 简化正则表达式
            return 'Name', (None, name)
        if name.isdigit() is True:
            return 'QQ', (None, name)
        return None, ('用户名不合法', None)
    return None, ('游戏类型错误', None)
