const fs = require('fs');
const path = require('path');
const { client, logch } = require("../index.js");

module.exports = {
    name: 'message',
    description: "Permet d'envoyer des messages avec le bot",
    execute(message, args) {

        // Prompt help
        if (!args[0] || args[0] == "help" || args[0] == "h") {
            message.channel.send(`
            Aide à propos de \`.message\` :
Pour utiliser la commande il vous suffit d'utiliser un des arguments suivants : 
> list *liste l'ensemble des messages envoyés par le bot en indiquant l'ID du message*
> send ChannelID/nomDuChannel le message que vous souhaitez envoyer
> edit MessageID (trouvable grâce à l'argument list) nouveau contenu du message
> add MessageID 🙂 @Role *ajoute la réaction 🙂 en dessous du message et donne le @Role à ceux qui cliquent dessus*
> rem MessageID 🙂 *supprime la réaction 🙂 en dessous du message*
> delete MessageID *supprime le message choisi (IRREVERSIBLE)*`);
        }

        // list messages
        else if (args[0] == "list") {
            const listMsg = fs.readdirSync(`./data/messages/`).filter(file => file.endsWith('.json'));
            console.log(listMsg);
            if (listMsg.length == 0) {
                console.log("pas de messages envoyés");
                return message.channel.send("Aucun message n'a été envoyé via le bot");
            }
            nbMessages = 0;
            messagetosend = "Liste des messages envoyés via le bot :\n";
            for (const msg of listMsg) {
                if (messagetosend.length >= 1400) {
                    message.channel.send(messagetosend);
                    messagetosend = "";
                }
                msgFileContent = JSON.parse(fs.readFileSync(path.resolve(`./data/messages/${msg}`)));
                if (!msgFileContent.deleted) {
                    nbMessages += 1;
                    messagetosend += ` - ${msgFileContent.id} dans <#${msgFileContent.channelid}> : *"${msgFileContent.content.slice(0, 30)}..."*\n`
                }
            }
            messagetosend += `${nbMessages} message(s) ont été envoyés via le bot`
            message.channel.send(messagetosend)
        }

        // send message
        else if (args[0] == "send") {
            if (!args[2]) return message.channel.send("Merci de vérifier d'entrer un channel et un message à envoyer (.message help)")

            // Check if this channel exists
            channeltosendname = message.guild.channels.cache.find(channel => channel.name.toLowerCase() == args[1])
            channeltosendid = client.channels.cache.get(args[1]);
            if (channeltosendname) {
                channeltosend = channeltosendname;
            }
            else if (channeltosendid) {
                channeltosend = channeltosendid;
            }
            else return message.channel.send("Merci de vérifier d'avoir entré un nom de channel (ou ID) valide")

            actualtimestamp = + new Date();
            args.splice(0, 2);
            messagecontent = args.join(" ");
            channeltosend.send(messagecontent).then(sent => {
                messageinfo = {
                    id: `${sent.channel.id}o${sent.id}`,
                    deleted: false,
                    channelid: sent.channel.id,
                    content: messagecontent,
                    created: actualtimestamp,
                    lastChange: actualtimestamp,
                    reactnumber: 0
                }
                const jsonStringmsg = JSON.stringify(messageinfo);
                fs.writeFile(`./data/messages/${sent.channel.id}o${sent.id}.json`, jsonStringmsg, err => {
                    if (err) {
                        console.log(`Error writing message`, err)
                    } else {
                        console.log(`Successfully wrote message`)
                    }
                });
                message.react("✅");
                message.channel.send("Message envoyé.")
            });
        }

        // edit message
        else if (args[0] == "edit") {
            if (!args[2]) return message.channel.send("Merci de vérifier d'entrer un id de message correct et un nouveau message(.message help)");
            try {
                idChMsg = args[1].split(/\o+/);
                argsmessage = args.slice(0);
                argsmessage.splice(0, 2);
                newcontent = argsmessage.join(" ");
                client.channels.cache.get(idChMsg[0]).messages.fetch(idChMsg[1]).then(msg => msg.edit(newcontent));
                // update message file
                updatemsg = JSON.parse(fs.readFileSync(path.resolve(`./data/messages/${args[1]}.json`)));
                actualtimestamp = + new Date();
                updatemsg.content = newcontent;
                updatemsg.lastChange = actualtimestamp;
                const jsonStringmsg = JSON.stringify(updatemsg);
                fs.writeFile(`./data/messages/${args[1]}.json`, jsonStringmsg, err => {
                    if (err) {
                        console.log(`Error writing message`, err)
                    } else {
                        console.log(`Successfully wrote message`)
                    }
                })
                message.react("✅");
                message.channel.send("Message modifié.")
            } catch (err) {
                console.error(err);
                return message.channel.send("Merci de vérifier d'entrer un id de message correct (.message list)");
            }
        }

        // delete message
        else if (args[0] == "delete" || args[0] == "del") {
            if (!args[1]) return message.channel.send("Merci de vérifier d'entrer un id de message correct (.message help)");
            try {
                idChMsg = args[1].split(/\o+/);
                client.channels.cache.get(idChMsg[0]).messages.fetch(idChMsg[1]).then(msg => msg.delete());
                // update message file
                updatemsg = JSON.parse(fs.readFileSync(path.resolve(`./data/messages/${args[1]}.json`)));
                updatemsg.deleted = true;
                actualtimestamp = + new Date();
                updatemsg.lastChange = actualtimestamp;
                const jsonStringmsg = JSON.stringify(updatemsg);
                fs.writeFile(`./data/messages/${args[1]}.json`, jsonStringmsg, err => {
                    if (err) {
                        console.log(`Error writing message`, err)
                    } else {
                        console.log(`Successfully wrote message`)
                    }
                })
                message.react("✅");
                message.channel.send("Message supprimé.")
            } catch (err) {
                console.error(err);
                return message.channel.send("Merci de vérifier d'entrer un id de message correct (.message list)");
            }
        }

        // add reaction
        else if (args[0] == "add") {
            if (!args[2]) return message.channel.send("Merci de mettre une emote valide");
            try {
                idChMsg = args[1].split(/\o+/);
                client.channels.cache.get(idChMsg[0]).messages.fetch(idChMsg[1]).then(msg => msg.react(args[2]));
                // update message file
                updatemsg = JSON.parse(fs.readFileSync(path.resolve(`./data/messages/${args[1]}.json`)));
                updatemsg.reactnumber += 1;
                eval(`updatemsg.emoj${updatemsg.reactnumber} = args[2];`);
                if (args[3] && args[3].length > 0) {
                    roleID = args[3].replace('<@&', '').replace('>', '');
                    rolefound = message.guild.roles.cache.find(r => r.id == roleID);
                    if (rolefound) {
                        eval(`updatemsg.action${updatemsg.reactnumber} = roleID;`);
                    }
                    else {
                        message.channel.send("Ceci n'est pas un rôle, l'emoj n'a donc été associé à aucun rôle");
                        eval(`updatemsg.action${updatemsg.reactnumber} = "none";`);
                    }
                }
                else {
                    message.channel.send("Vous n'avez pas précisé de rôle, l'emoj n'a donc été associé à aucun rôle");
                    eval(`updatemsg.action${updatemsg.reactnumber} = "none";`);
                }
                actualtimestamp = + new Date();
                updatemsg.lastChange = actualtimestamp;
                const jsonStringmsg = JSON.stringify(updatemsg);
                fs.writeFile(`./data/messages/${args[1]}.json`, jsonStringmsg, err => {
                    if (err) {
                        console.log(`Error writing message`, err)
                    } else {
                        console.log(`Successfully wrote message`)
                    }
                })
                message.react("✅");
                message.channel.send("Réaction ajoutée.")
            } catch (err) {
                console.error(err);
                return message.channel.send("Merci de vérifier d'entrer un id de message correct (.message list) et/ou une emote valide");
            }
        }

        // remove reaction
        else if (args[0] == "rem") {
            if (!args[2]) return message.channel.send("Merci de mettre une emote valide");
            try {
                idChMsg = args[1].split(/\o+/);
                client.channels.cache.get(idChMsg[0]).messages.fetch(idChMsg[1]).then(msg => msg.reactions.cache.find(reaction => reaction.emoji.name == args[2]).remove());
                // update message file
                updatemsg = JSON.parse(fs.readFileSync(path.resolve(`./data/messages/${args[1]}.json`)));
                for (let index = 1; index < updatemsg.reactnumber + 1; index++) {
                    eval(`if (updatemsg.emoj${index} == args[2]) updatemsg.emoj${index} = "Deleted"`);
                }

                actualtimestamp = + new Date();
                updatemsg.lastChange = actualtimestamp;
                const jsonStringmsg = JSON.stringify(updatemsg);
                fs.writeFile(`./data/messages/${args[1]}.json`, jsonStringmsg, err => {
                    if (err) {
                        console.log(`Error writing message`, err)
                    } else {
                        console.log(`Successfully wrote message`)
                    }
                })
                message.react("✅");
                message.channel.send("Réaction supprimée.")
            } catch (err) {
                console.error(err);
                return message.channel.send("Merci de vérifier d'entrer un id de message correct (.message list) et/ou une emote valide");
            }
        }
    }
}