# NOTE: this file contains backports or unintroduced features of next versions of dpy (as for 1.7.3)
import discord
from discord.http import Route


async def create_thread(
    bot,
    channel: discord.TextChannel,
    name: str,
    archive: int = 1440,
    message: discord.Message = None,
):
    """
    Creates a new thread in the channel from the message

    Args:
        channel (TextChannel): The channel the thread will be apart of
        message (Message): The discord message the thread will start with
        name (str): The name of the thread
        archive (int): The archive duration. Can be 60, 1440, 4320, and 10080.

    Returns:
        int: The channel ID of the newly created thread

    Note:
        The guild must be boosted for longer thread durations then a day. The archive parameter will automatically be scaled down if the feature is not present.

        Raises HTTPException 400 if thread creation fails
    """
    guild = channel.guild
    if archive > 10080:
        archive = 10080

    reason = "Thread Rotation"
    fields = {"name": name, "auto_archive_duration": archive}

    if message is not None:
        r = Route(
            "POST",
            "/channels/{channel_id}/messages/{message_id}/threads",
            channel_id=channel.id,
            message_id=message.id,
        )
    else:
        fields["type"] = 11
        r = Route(
            "POST",
            "/channels/{channel_id}/threads",
            channel_id=channel.id,
        )

    return (await bot.http.request(r, json=fields, reason=reason))["id"]


async def send_thread_message(
    bot,
    thread_id: int,
    content: str,
    mention_roles: list = [],
):
    """
    Send a message in a thread, allowing pings for roles

    Args:
        bot (Red): The bot object
        thread_id (int): ID of the thread
        content (str): The message to send
        mention_roles (list, optional): List of role ids to allow mentions. Defaults to [].

    Returns:
        int: ID of the new message
    """
    fields = {"content": content, "allowed_mentions": {"roles": mention_roles}}

    r = Route(
        "POST",
        "/channels/{channel_id}/messages",
        channel_id=thread_id,
    )

    return (await bot.http.request(r, json=fields))["id"]


async def add_user_thread(bot, channel: int, member: discord.Member):
    """
    Add a user to a thread

    Args:
        channel (int): The channel id that represents the thread
        member (Member): The member to add to the thread
    """
    reason = "Thread Manager"

    r = Route(
        "POST",
        "/channels/{channel_id}/thread-members/{user_id}",
        channel_id=channel,
        user_id=member.id,
    )

    return await bot.http.request(r, reason=reason)


async def get_active_threads(bot, guild: discord.Guild):
    """
    Get all active threads in the guild

    Args:
        guild (Guild): The guild to get active threads in

    Returns:
        list(int): List of thread IDs of each actuvate thread
    """

    reason = "Thread Manager"

    r = Route(
        "GET",
        "/guilds/{guild_id}/threads/active",
        guild_id=guild.id,
    )

    res = await bot.http.request(r, reason=reason)

    return [t["id"] for t in res["threads"]]
