import asyncio
import aiocron
from async_timeout import timeout

import yaml
from yaml.loader import SafeLoader

import discord
import discord.utils
from discord import option
from discord.ext import commands

import mysql.connector
from mysql.connector import Error

import time
from datetime import date, datetime, tzinfo

import os

import flask

from easy_pil import Canvas, Editor, Font, Text, font, load_image_async
from PIL import Image, ImageDraw, ImageFont, ImageOps
import pytz
import socket

from Crypto.Cipher import AES


time_date = "%Y/%m/%d"
time_year = "%Y"
time_month = "%m"
time_day = "%d"

time_time = "%H:%M:%S"
time_hour = "%H"
time_minute = "%M"
time_second = "%S"

time_datetime = "%Y/%m/%d " "|" " %H:%M:%S"

key = b'U05EWL+hyjDw83KtG3jjUrBvKNOXR5mX'

## Class

class Messagbuilder(commands.Cog):
    
    def __init__(self, bot):
        self.bot = bot
        global path
        path = bot.path



async def editvariabels(message, user, member, msg, channel):
    if user is not None:
        message = message.replace("{{user.name}}", user.name)
        message = message.replace("{{user.mention}}", user.mention)

    if member is not None:
        membertext = ""
        for m in member:
            membertext = membertext + m.mention
        message = message.replace("{{member.added.mention}}", membertext)

    if channel is not None:
        message = message.replace("{{channel.name}}", channel.name)
        message = message.replace("{{channel.mention}}", channel.mention)

    if msg is not None:
        message = message.replace("{{message.id}}", str(msg))

    if time is not None:
        message = message.replace("{{time.date}}", datetime.now().strftime(time_date))
        message = message.replace("{{time.year}}", datetime.now().strftime(time_year))
        message = message.replace("{{time.month}}", datetime.now().strftime(time_month))
        message = message.replace("{{time.day}}", datetime.now().strftime(time_date))
        message = message.replace("{{time.time}}", datetime.now().strftime(time_time))
        message = message.replace("{{time.hour}}", datetime.now().strftime(time_hour))
        message = message.replace("{{time.minute}}", datetime.now().strftime(time_minute))
        message = message.replace("{{time.second}}", datetime.now().strftime(time_second))
        message = message.replace("{{time.datetime}}", datetime.now().strftime(time_datetime))

    return message



async def createembed(path, servername, file, conf, cat, user, member, msg, channel):
    with open(fr'{path}/Configs/{servername}/{file}', encoding='utf8') as f:
        data = yaml.load(f, Loader=SafeLoader)

    Embed = discord.Embed()

    if cat is not None:
        length = len(data[conf][cat]['Embed']["fields"])

        if data[conf][cat]["Embed"]["header"]["title"] is not None:
            Embed.title = await editvariabels(data[conf][cat]["Embed"]["header"]["title"], user, member, msg, channel)

        if data[conf][cat]["Embed"]["header"]["description"] is not None:
            Embed.description = await editvariabels(data[conf][cat]["Embed"]["header"]["description"], user, member, msg, channel)

        if data[conf][cat]["Embed"]["header"]["color"] is not None:
            Embed.color = int(data[conf][cat]["Embed"]["header"]["color"], 16)

        else:
            return False
        
        if data[conf][cat]["Embed"]["header"]["url"] != "None":
            Embed.url = data[conf][cat]["Embed"]["header"]["url"]
        
        if data[conf][cat]["Embed"]["thumbnail"] != "None":
            Embed.set_thumbnail(url=data[conf][cat]["Embed"]["thumbnail"])

        if data[conf][cat]["Embed"]["picture"] != "None":
            Embed.set_image(url=data[conf][cat]["Embed"]["picture"])

        if data[conf][cat]["Embed"]["footer"] != "None":
            Embed.set_footer(text=await editvariabels(data[conf][cat]["Embed"]["footer"], user, member, msg, channel))

        for i in range(0, length, 1):
            Embed.add_field(
                name= await editvariabels(data[conf][cat]["Embed"]["fields"][i]["name"], user, member, msg, channel),
                value= await editvariabels(data[conf][cat]["Embed"]["fields"][i]["value"], user, member, msg, channel),
                inline= data[conf][cat]["Embed"]["fields"][i]["inline"]
            )

    else:
        length = len(data[conf]['Embed']["fields"])

        if data[conf]["Embed"]["header"]["title"] is not None:
            Embed.title = await editvariabels(data[conf]["Embed"]["header"]["title"], user, member, msg, channel)

        if data[conf]["Embed"]["header"]["description"] is not None:
            Embed.description = await editvariabels(data[conf]["Embed"]["header"]["description"], user, member, msg, channel)

        if data[conf]["Embed"]["header"]["color"] is not None:
            Embed.color = int(data[conf]["Embed"]["header"]["color"], 16)

        else:
            return False
        
        if data[conf]["Embed"]["header"]["url"] != "None":
            Embed.url = data[conf]["Embed"]["header"]["url"]
        
        if data[conf]["Embed"]["thumbnail"] != "None":
            Embed.set_thumbnail(url=data[conf]["Embed"]["thumbnail"])

        if data[conf]["Embed"]["picture"] != "None":
            Embed.set_image(url=data[conf]["Embed"]["picture"])

        if data[conf]["Embed"]["footer"] != "None":
            Embed.set_footer(text=await editvariabels(data[conf]["Embed"]["footer"], user, member, msg, channel))

        for i in range(0, length, 1):
            Embed.add_field(
                name= await editvariabels(data[conf]["Embed"]["fields"][i]["name"], user, member, msg, channel),
                value= await editvariabels(data[conf]["Embed"]["fields"][i]["value"], user, member, msg, channel),
                inline= data[conf]["Embed"]["fields"][i]["inline"]
            )

    return Embed



async def createembednoconf(title, description, color, url, fields, footer, thumbnail, picture):
    Embed = discord.Embed()

    length = len(fields)

    if title is not None:
        Embed.title = title

    if description is not None:
        Embed.description = description

    if color is not None:
        Embed.color = int(color, 16)

    else:
        return False
    
    if url is not None:
        Embed.url = url

    if thumbnail is not None:
        Embed.set_thumbnail(url=thumbnail)

    if picture is not None:
        Embed.set_image(url=picture)

    if footer is not None:
        Embed.set_footer(text=footer)

    for i in range(0, length, 1):
        Embed.add_field(
            name= fields[i][0],
            value= fields[i][1],
            inline= fields[i][2]
        )

    return Embed





async def editembed(Embed, interaction):
    pass



def setup(bot):
    bot.add_cog(Messagbuilder(bot))