const axios = require('axios').default;
const Discord = require('discord.js');
const fs = require('fs');
require('dotenv').config();

module.exports = {
    randomColor: randomColor,
    RNG: RNG,
    getGifs: getGifs,
    getGifEmbed: getGifEmbed,
    getGifWithMessage: getGifWithMessage,
    returnPromiseString: returnPromiseString,
    writeToFile: writeToFile,
};

function randomColor() {
    let color = '#';
        for (let i = 0; i < 6; i++) {
            const random = Math.random();
            const bit = (random * 16) | 0;
            color += (bit).toString(16);
        }
        return color;
}

function RNG(max) {
    return Math.floor(Math.random() * max);
}

async function getGifs(gifs) {
    return new Promise((resolve) => {
        resolve(axios.get(gifs));
    });
}

async function getGifEmbed(gifQuery, gifAmount) {
    const response = await getGifs(gifQuery);
    const gif = response.data.results[RNG(gifAmount)].media[0].gif.url;
    const gifEmbed = new Discord.MessageEmbed()
        .setImage(gif)
        .setColor(randomColor());

    return gifEmbed;
}

async function getGifWithMessage(interaction, gifQuery, gifAmount) {
    const gifEmbed = getGifEmbed(gifQuery, gifAmount);

    let who;
    try {
        who = interaction.options.getMentionable('who');
    }
    catch {
        return gifEmbed;
    }
    (await gifEmbed).setDescription(interaction.user.username
        + ` ${interaction.commandName}s ` + `${who}`);
    return gifEmbed;
}

async function returnPromiseString(guildMembers) {
    return new Promise(() => {
        guildMembers.fetch();
    });
}

function writeToFile(content, path) {
    const jsonString = JSON.stringify(content, null, 4);
    let error = null;
    fs.writeFile(path, jsonString, 'utf8', (err) => {
        if (err) {
            error = 'There was an error while updating the birthday list';
        }
    });
    return error;
}