/**
    List of intents
    https://discord.com/developers/docs/topics/gateway#privileged-intents
*/

const Discord = require('discord.js');
const {
    Client,
    Collection,
    Intents,
    MessageAttachment,
} = require('discord.js');
const client = new Client({
    intents: [
        Intents.FLAGS.GUILDS,
        Intents.FLAGS.GUILD_MESSAGES,
        Intents.FLAGS.GUILD_MESSAGE_REACTIONS,
        Intents.FLAGS.GUILD_MEMBERS,
    ],
});

const fs = require('fs');
require('dotenv').config();

client.commands = new Collection();
const commandFiles = fs.readdirSync('./commands')
    .filter(file => !file.includes('WIP'));

const cron = require('node-cron');
for (const file of commandFiles) {
    const command = require(`./commands/${file}`);
    // Set a new item in the Collection
    // With the key as the command name and the value as the exported module
    client.commands.set(command.data.name, command);
}

const help = require('./helpFunctions.js');

client.once('ready', () => {
    if (client.user.username != 'MOOver Debug') {
        client.channels.cache.get('780439236867653635').send('Just turned on!');
    }
    // cron.schedule('0 13 * * *', async function() {
    //    pingEvent();
    // });
    console.log('Running!');
});

client.on('messageCreate', gotMessage);

client.on('interactionCreate', async interaction => {
    if (!interaction.isCommand()) return;

    const command = client.commands.get(interaction.commandName);

    if (!command) return;

    try {
        await command.execute(interaction);
    }
    catch (error) {
        console.error(error);
        await interaction.reply({
            content: 'There was an error while executing this command!',
            ephemeral: true,
        });
    }
});

function gotMessage(message) {
    if (message.content.includes('https://media.discordapp.net') &&
        (message.content.includes('webm') ||
            message.content.includes('mov') ||
            message.content.includes('mp4'))) {
        const linkArr = message.content.split('https://media.discordapp.net');
        message.channel.send('https://cdn.discordapp.com' + linkArr[1]);
    }

    const chance = help.RNG(3000);
    if (chance == 1337) {
        whoAsked(message);
    }

    const msg = message.content.toLowerCase();

    const content = message.content.trim();

    const msgContentSplit = content.split(/[ ]+/);

    /**
     * reference can't be null => must be a reply to message
     * must contain only one argument
     * that argument mentions channel
     */

    if (message.reference != null && msgContentSplit.length == 1 &&
        message.mentions.channels.first() != undefined) {
        move(message, msgContentSplit[0]);
    }

    const isBot = message.author.bot;

    if (!isBot) {
        if (msg.includes('henlo')) {
            henlo(message);
        }
        else if (msg.includes('how ye')) {
            mood(message);
        }
        else if (msg.includes('tylko jedno')) {
            message.channel.send('Koksu pięć gram odlecieć sam');
        }
    }
}

// Responses
function henlo(message) {
    const emojis = ['🥰', '🐄', '🐮', '❤️', '👋', '🤠', '😊'];
    const randomNum = help.RNG(emojis.length);
    message.reply('Henlooo ' + message.author.username + '   ' + emojis[randomNum]);
}

function mood(message) {
    const responses = ['Not bad, how yee?', 'MOOdy', 'A bit sad 😢', 'Good, how yee?', 'I\'m fine, how yee?'];
    const randomNum = help.RNG(responses.length);
    message.reply(responses[randomNum]);
}

function move(message, channelId) {
    message.react('🐮');

    const replyChannel = message.channel;

    const msgToMooveId = message.reference.messageId;

    const mentionedChannelId = channelId.substring(2, channelId.length - 1);

    replyChannel.messages.fetch(msgToMooveId).then(msg => {
        if (msg.attachments.size > 0) {
            const newMsgAttachments = [];
            const allAttachments = msg.attachments.values();

            for (let i = 0; i < msg.attachments.size; i++) {
                const currAttachment = allAttachments.next().value;
                newMsgAttachments.push(new MessageAttachment(currAttachment.url));
            }

            if (msg.embeds.length > 0) {
                client.channels.cache.get(mentionedChannelId)
                    .send({ content: `Sent by ${msg.author}\nmooved ${message.author}`, embeds: msg.embeds, files: newMsgAttachments });
            }
            else {
                client.channels.cache.get(mentionedChannelId)
                    .send({ content: `Sent by ${msg.author}\nmooved ${message.author}`, files: newMsgAttachments });
            }
        }
        else {
            const embed = new Discord.MessageEmbed()
                .setColor(help.randomColor())
                .addField('MOO', `Sent by ${msg.author}\nmooved ${message.author}`);
                if (msg.content.includes('http')) {
                    const file = new MessageAttachment(msg.content);
                    client.channels.cache.get(mentionedChannelId).send({
                        embeds: [embed], files: [file] });
                }
                else {
                    embed.addField('Message:', msg.content);
                    client.channels.cache.get(mentionedChannelId).send({
                        embeds: [embed] });
                }
            }
        setTimeout(() => msg.delete(), 3000);
    });
    setTimeout(() => message.delete(), 3000);
}

async function whoAsked(message) {
    const searchKey = 'who-asked';
    const gifAmount = 20;
    const gifs = `https://g.tenor.com/v1/search?q=${searchKey}&key=${process.env.TENOR}&limit=${gifAmount}`;

    message.reply({ embeds: [help.getGifEmbed(gifs, gifAmount)] });
}

async function pingEvent() {
    const currentDay = new Date().getDate();
    const currentMonth = new Date().getMonth();

    const guildIds = [];
    const sysChannelIds = [];
    client.guilds.cache.forEach(element => {
        sysChannelIds.push(element.channels.guild.systemChannelId);
        guildIds.push(element.id);
    });
    // TODO deduplicate
    const birthdays = require('./database/birthdays.json');
    const todayBirthdays = [];
    for (let i = 0; i < birthdays.length; i++) {
        if (birthdays[i].day == currentDay && birthdays[i].month == currentMonth) {
            todayBirthdays.push((birthdays[i].id, birthdays[i].nickname));
        }
    }

    if (todayBirthdays != []) {
        for (let i = 0; i < guildIds.length; i++) {
            const guildId = guildIds[i];
            const sysChannelId = sysChannelIds[i];
            const guild = client.guilds.cache.find((g) => g.id == guildId);
            for (let j = 0; j < todayBirthdays.length; j++) {
                const userId = todayBirthdays[i][0];
                if ((await guild.members.fetch()).find(user => user.id == userId) != undefined) {
                    client.channels.cache.get(sysChannelId).send(`Happy birthday <@${userId}>!`);
                }
            }
        }
    }

    const eventsJSON = require('./database/events.json');
    const globalEvents = eventsJSON.global;
    const todayGlobalEvents = [];
    for (let i = 0; i < globalEvents.length; i++) {
        if (globalEvents[i].day == currentDay && globalEvents[i].month == currentMonth) {
            todayGlobalEvents.push((globalEvents[i].id));
        }
    }

    for (let i = 0; i < guildIds.length; i++) {
        const guildId = guildIds[i];
        const guildEvents = eventsJSON[guild];
        const sysChannelId = sysChannelIds[i];
        const guild = client.guilds.cache.find((g) => g.id == guildId);
        if (todayGlobalEvents != []) {
            for (let j = 0; j < todayGlobalEvents.length; j++) {
                let specialMessage;
                if (todayGlobalEvents[i].name == 'Valentine\'s Day') {
                    specialMessage = '\n Don\'t forget I love you all with all my hart 🥺';
                }
                client.channels.cache.get(sysChannelId)
                    .send(`It's ${todayGlobalEvents} today!` + specialMessage);
            }
        for (let j = 0; j < guildEvents.length; j++) {
            if (guildEvents[i].day == currentDay && guildEvents[i].month == currentMonth) {
                client.channels.cache.get(sysChannelId)
                    .send(`It's ${todayGlobalEvents} today!`);
            }
        }
    }
    }
}

client.login(process.env.TOKEN);
