import re

import arguments
import commands
import utils


async def clear(message):
    tokens = commands.tokenize(message.content)
    parser = arguments.ArgumentParser(
        tokens[0],
        "bulk delete messages in the current channel matching certain criteria",
    )
    parser.add_argument(
        "count",
        type=int,
        choices=range(1, 1001),
        metavar="[1-1000]",
        help="amount of messages to delete",
    )
    parser.add_argument(
        "-r",
        "--regex",
        required=False,
        help="delete messages with content matching this regex",
    )
    parser.add_argument(
        "-i",
        "--author-id",
        type=int,
        action="append",
        help="delete messages whose author matches this id",
    )
    parser.add_argument(
        "-o",
        "--oldest-first",
        action="store_true",
        help="delete oldest messages first",
    )
    if not (args := await parser.parse_args(message, tokens)):
        return

    def check(m):
        c = []
        if r := args.regex:
            c.append(re.match(r, m.content))
        if i := args.author_id:
            c.append(m.author.id in i)
        return all(c)

    message_count = len(
        await message.channel.purge(
            limit=args.count, check=check, oldest_first=args.oldest_first
        )
    )
    try:
        await utils.reply(
            message,
            f"purged **{message_count} {'message' if message_count == 1 else 'messages'}**",
        )
    except:
        pass