const mysql = require('mysql');
const db = mysql.createConnection({
    host: process.env.DBHOST,
    user: process.env.DBUSER,
    password: process.env.DBPASS,
    database: process.env.DBNAME,
    port: process.env.DBPORT
});

module.exports = {
    GuildInfo: class {
        constructor() {
            this.guildId = "";
            this.treeName = "";
            this.treeHeight = 0;
            this.treeMessageId = "";
            this.treeChannelId = "";
            this.leaderboardMessageId = "";
            this.leaderboardChannelId = "";
            this.waterMessage = "";
            this.waterRoleId = "";
            this.fruitMessage = "";
            this.fruitRoleId = "";
            this.reminderChannelId = "";
            this.watchChannelId = "";
            this.notificationsEnabled = false;
            this.compareChannelId = "";
            this.compareMessageId = "";
        }
    
        setId(id) {
            this.guildId = id;
            return this;
        }
        setName(name) {
            this.treeName = name;
            return this;
        }
        setHeight(height) {
            this.treeHeight = height;
            return this;
        }
        setTreeMessage(messageId, channelId) {
            this.treeMessageId = messageId ? messageId : this.treeMessageId;
            this.treeChannelId = channelId;
            return this;
        }
        setTreeInfo(name, height, channelId, messageId) {
            this.treeName = name ? name : this.treeName;
            this.treeHeight = height;
            this.treeChannelId = channelId ? channelId : this.treeChannelId;
            this.treeMessageId = messageId ? messageId : this.treeMessageId;
            return this;
        }
        setLeaderboardMessage(messageId, channelId) {
            this.leaderboardMessageId = messageId ? messageId : this.leaderboardMessageId;
            this.leaderboardChannelId = channelId ? channelId : this.leaderboardChannelId;
            return this;
        }
        setCompareMessage(channelId, messageId) {
            this.compareChannelId = channelId;
            this.compareMessageId = messageId;
            return this;
        }
        setReminders(waterMessage, fruitMessage, reminderChannelId, watchChannelId, enabled) {
            if (waterMessage) this.waterMessage = waterMessage;
            if (fruitMessage) this.fruitMessage = fruitMessage;
            if (reminderChannelId) this.reminderChannelId = reminderChannelId;
            if (watchChannelId) this.watchChannelId = watchChannelId;
            if (enabled) this.notificationsEnabled = enabled;
            return this;
        }
        setRoles(waterRoleId, fruitRoleId) {
            this.waterRoleId = waterRoleId;
            if (fruitRoleId) this.fruitRoleId = fruitRoleId;
            return this;
        }
        queryBuilder(query) {
            let queryParts = [];
            switch (query) {
                case "setAll":
                    queryParts = [
                        `INSERT INTO guild_info `,
                        `(guild_id, `,
                        `tree_name, `,
                        `tree_height, `,
                        `tree_message_id, `,
                        `tree_channel_id, `,
                        `leaderboard_message_id, `,
                        `leaderboard_channel_id, `,
                        `water_message, `,
                        `fruit_message, `,
                        `reminder_channel_id, `,
                        `watch_channel_id) `,
                        `VALUES (${db.escape(this.guildId)}, `,
                        `${db.escape(this.treeName)}, `,
                        `${db.escape(this.treeHeight)}, `,
                        `${db.escape(this.treeMessageId)}, `,
                        `${db.escape(this.treeChannelId)}, `,
                        `${db.escape(this.leaderboardMessageId)}, `,
                        `${db.escape(this.leaderboardChannelId)}, `,
                        `${db.escape(this.waterMessage)}, `,
                        `${db.escape(this.fruitMessage)}, `,
                        `${db.escape(this.reminderChannelId)}, `,
                        `${db.escape(this.watchChannelId)}) `,
                        `ON DUPLICATE KEY UPDATE tree_name = ${db.escape(this.treeName)}, `,
                        `tree_height = ${db.escape(this.treeHeight)}, `,
                        `tree_message_id = ${db.escape(this.treeMessageId)}, `,
                        `tree_channel_id = ${db.escape(this.treeChannelId)}, `,
                        `leaderboard_message_id = ${db.escape(this.leaderboardMessageId)}, `,
                        `leaderboard_channel_id = ${db.escape(this.leaderboardChannelId)}, `,
                        `water_message = ${db.escape(this.waterMessage)}, `,
                        `fruit_message = ${db.escape(this.fruitMessage)}, `,
                        `reminder_channel_id = ${db.escape(this.reminderChannelId)}, `,
                        `watch_channel_id = ${db.escape(this.watchChannelId)})`
                    ];
                    return queryParts.join('');
                    break;
                case "setReminders":
                    queryParts = [
                        `INSERT INTO guild_info (guild_id, water_message, fruit_message, reminder_channel_id, watch_channel_id, notifications_enabled) VALUES (`,
                        `${db.escape(this.guildId)},`,
                        `${db.escape(this.waterMessage)},`,
                        `${db.escape(this.fruitMessage)},`,
                        `${db.escape(this.reminderChannelId)},`,
                        `${db.escape(this.watchChannelId)},`,
                        `${db.escape(this.notificationsEnabled)}`,
                        `) ON DUPLICATE KEY UPDATE water_message = ${db.escape(this.waterMessage)}, `,
                        `fruit_message = ${db.escape(this.fruitMessage)}, `,
                        `reminder_channel_id = ${db.escape(this.reminderChannelId)}, `,
                        `watch_channel_id = ${db.escape(this.watchChannelId)},`,
                        `notifications_enabled = ${db.escape(this.notificationsEnabled)}`
                    ];
                    return queryParts.join('');
                    break;
                case "setTreeMessage":
                    queryParts = [
                        `UPDATE guild_info SET tree_message_id = ${db.escape(this.treeMessageId)}, `,
                        `tree_channel_id = ${db.escape(this.treeChannelId)} `,
                        `WHERE guild_id = ${db.escape(this.guildId)}`
                    ];
                    return queryParts.join('');
                    break;
                case "setLeaderboardMessage":
                    queryParts = [
                        `UPDATE guild_info SET leaderboard_message_id = ${db.escape(this.leaderboardMessageId)}, `,
                        `leaderboard_channel_id = ${db.escape(this.leaderboardChannelId)} `,
                        `WHERE guild_id = ${db.escape(this.guildId)}`
                    ];
                    return queryParts.join('');
                    break;
                case "setRoles":
                    if (this.fruitRoleId != "") {
                        queryParts = [
                            `INSERT INTO guild_info (`,
                            `guild_id, water_role_id, fruit_role_id`,
                            `) VALUES (`,
                            `${db.escape(this.guildId)}, ${db.escape(this.waterRoleId)}, ${db.escape(this.fruitRoleId)}`,
                            `) ON DUPLICATE KEY UPDATE water_role_id = ${db.escape(this.waterRoleId)}, `,
                            `fruit_role_id = ${db.escape(this.fruitRoleId)}`
                        ];
                    } else {
                        queryParts = [
                            `UPDATE guild_info SET water_role_id = ${db.escape(this.waterRoleId)} `,
                            `WHERE guild_id = ${db.escape(this.guildId)}`
                        ];
                    }
                    return queryParts.join('');
                    break;
                case "setTreeInfo":
                    queryParts = [
                        `INSERT INTO guild_info (`,
                        `guild_id, tree_name, tree_height, tree_channel_id, tree_message_id`,
                        `) VALUES (`,
                        `${db.escape(this.guildId)}, ${db.escape(this.treeName)}, ${db.escape(this.treeHeight)}, ${db.escape(this.treeChannelId)}, ${db.escape(this.treeMessageId)}`,
                        `) ON DUPLICATE KEY UPDATE tree_name = ${db.escape(this.treeName)}, `,
                        `tree_height = ${db.escape(this.treeHeight)}, `,
                        `tree_channel_id = ${db.escape(this.treeChannelId)}, `,
                        `tree_message_id = ${db.escape(this.treeMessageId)}`
                    ];
                    return queryParts.join('');
                case "setCompareMessage":
                    queryParts = [
                        `INSERT INTO guild_info (`,
                        `guild_id, compare_channel_id, compare_message_id`,
                        `) VALUES (`,
                        `${db.escape(this.guildId)}, ${db.escape(this.compareChannelId)}, ${db.escape(this.compareMessageId)}`,
                        `) ON DUPLICATE KEY UPDATE compare_channel_id = ${db.escape(this.compareChannelId)}, compare_message_id = ${db.escape(this.compareMessageId)}`,
                    ];
                    return queryParts.join('');
                default:
                    break;
            }
        }
        generateSetupInfo() {
            let setupInfoParts = [
                `Here is your server's configuration:`,
                `Tree Name: ${this.treeName}`,
                `Tree Height: ${this.treeHeight}`,
                `Tree Channel: <#${this.treeChannelId}>`,
                `[Tree Link](https://discord.com/channels/${this.guildId}/${this.treeChannelId}/${this.treeMessageId})`,
                `Leaderboard Channel: <#${this.leaderboardChannelId}>`,
                `[Leaderboard Link](https://discord.com/channels/${this.guildId}/${this.leaderboardChannelId}/${this.leaderboardMessageId})`,
                `Notification Watch Channel: <#${this.watchChannelId}>`,
                `Notification Relay Channel: <#${this.reminderChannelId}>`,
                `Water Message: ${this.waterMessage}`,
                `Fruit Message: ${this.fruitMessage}`,
                `Water Role: <@&${this.waterRoleId}>`,
                `Fruit Role: <@&${this.fruitRoleId}>`
            ]
            return setupInfoParts.join('\n');
        }
    }
}