const Command = require('../../base/Command.js');
const fetch = require('node-fetch');
const windrose = require('windrose');
const ISO2 = require('../../assets/ISO2.json');


module.exports = class Weather extends Command {
    constructor (name, category) {
        super (name, category);
        this.name = name,
        this.description = 'View the weather in a place ',
        this.options = [
            {
                type: 3,
                name: 'city',
                description: 'The city to check the weather at',
                required: true
            },
            {
                type: 3,
                name: 'country',
                description: 'The country the city is in',
            }
        ],
        this.category = category,
        this.cooldown = 10000;
    }

    async run (client, interaction, data) { //eslint-disable-line no-unused-vars

        const city = await interaction.options.get('city').value;
        let country = await interaction.options.get('country');
        let countryCode = '';

        if (country) {
            country = country.value;
            countryCode += ',';
            if (ISO2.country[country.toProperCase().trim()]) {
                countryCode += ISO2.country[country.toProperCase().trim()];
            } else {
                countryCode += country.trim();
            }
        }

        fetch(`https://api.openweathermap.org/data/2.5/weather?q=${city + countryCode}&appid=${client.config.keys.weather}`, { headers: { 'User-Agent': client.config.userAgent }})
            .then(res => res.json())
            .then(json => {
                if (json.cod >= 200 && json.cod <= 299) {
                    const tempCelsius = Math.round(json.main.temp - 273.15);
                    let embedColor;
                    if (tempCelsius < 0) {
                        embedColor = '#addeff';
                    } else if (tempCelsius < 20) {
                        embedColor = '#4fb8ff';
                    } else if (tempCelsius < 26) {
                        embedColor = '#ffea4f';
                    } else if (tempCelsius < 31) {
                        embedColor = '#ffa14f';
                    } else {
                        embedColor = '#ff614f';
                    }
        
                    const embed = new client.EmbedBuilder()
                        .setTitle('Current conditions in ' + city.toProperCase() + ', ' + ISO2.code[json.sys.country])
                        .setThumbnail(`https://openweathermap.org/img/wn/${json.weather[0].icon}@4x.png`)
                        .setColor(embedColor)
                        .addFields([
                            { name: 'Condition:', value: json.weather[0].main, inline: true },
                            { name: 'Temperature:', value: `${tempCelsius}°C ・ ${Math.round(json.main.temp * 9/5 - 459.67)}°F`, inline: true },
                            { name: 'Min/Max:', value:`
                                ${Math.round(json.main.temp_min - 273.15)}°C ・ ${Math.round(json.main.temp_max - 273.15)}°C
                                ${Math.round(json.main.temp_min * 9/5 - 459.67)}°F ・ ${Math.round(json.main.temp_max * 9/5 - 459.67)}°F
                            `, inline: true},
                            { name: 'Humidity:', value: `${json.main.humidity}%`, inline: true },
                            { name: 'Wind Speed:', value: `${Math.round(json.wind.speed * 10) / 10}km/h ・ ${Math.round(json.wind.speed * 10 / 1.609344)}mi/h`, inline: true },
                            { name: 'Wind Direction:', value: windrose.getPoint(json.wind.deg).name, inline: true}
                        ])
                        .setFooter({ text: 'Powered by openweathermap.org'});
        
                    return interaction.reply({embeds: [embed]});
                } else {
                    if (json.message && json.message === 'city not found') {
                        return interaction.reply({
                            content: `${client.config.emojis.userError} ${city.toProperCase()} is not listed in my sources.`,
                            ephemeral: true
                        });
                    }
                    client.logger.error('WEATHER_COMMAND_ERROR', `API Error: ${json}`);
                    return interaction.reply({
                        content: `${client.config.emojis.botError} API error occurred: \`code ${json.cod}\``,
                        ephemeral: true
                    });
                }
            });

    }
};