import os
import re
from datetime import datetime

from discord.ext.commands import Context
from discord import ButtonStyle, Embed, User, Member
from dotenv import load_dotenv

from deprecated.views.dialog_view import DialogView

load_dotenv()
DATE_TIME_FMT = os.getenv("DISCORD_DATE_TIME_FORMAT")


async def send_dm(user, message, embed=None):
    """ Send DM to a user/member """

    try:
        if type(user) is User or type(user) is Member:
            if user.dm_channel is None:
                await user.create_dm()

            return await user.dm_channel.send(message, embed=embed)
    except:
        print(f"Cannot send DM to {user} with text: {message}")


def is_mod(context_or_interaction):
    if isinstance(context_or_interaction, Context):
        author = context_or_interaction.author
    else:
        author = context_or_interaction.user
    roles = author.roles

    for role in roles:
        if role.id == int(os.getenv("DISCORD_MOD_ROLE")):
            return True

    return False


def is_valid_time(time):
    return re.match(r"^\d+[mhd]?$", time)


def to_minutes(time):
    if time[-1:] == "m":
        return int(time[:-1])
    elif time[-1:] == "h":
        h = int(time[:-1])
        return h * 60
    elif time[-1:] == "d":
        d = int(time[:-1])
        h = d * 24
        return h * 60

    return int(time)


async def confirm(channel, title, description, message="", custom_prefix="", callback=None):
    embed = Embed(title=title,
                          description=description,
                          color=19607)
    return await channel.send(message, embed=embed, view=DialogView([
        {"emoji": "👍", "custom_id": f"{custom_prefix}_yes", "style": ButtonStyle.green},
        {"emoji": "👎", "custom_id": f"{custom_prefix}_no", "style": ButtonStyle.red},
    ]))


def date_to_string(date: datetime):
    return date.strftime(DATE_TIME_FMT)


def date_from_string(date: str):
    return datetime.strptime(date, DATE_TIME_FMT)


async def files_from_attachments(attachments):
    files = []
    for attachment in attachments:
        files.append(await attachment.to_file(spoiler=attachment.is_spoiler()))

    return files