import { HaikuClient } from 'jshaiku';
import express from 'express';
import bodyParser from 'body-parser';
import generateEmojiEmbed from "../utils/generateEmojiEmbed.js";

const jsonParser = bodyParser.json();
const app = express();
const port = 10000;

const runServer = (client: HaikuClient) => {
    app.get('/', (req, res) => {
        res.send(client.ws.ping);
    });

    app.post('/verify/:code', jsonParser, async function (req, res) {
        const code = req.params.code;
        const secret = req.body.secret;
        if (secret === client.config.verifySecret) {
            let guild = await client.guilds.fetch(client.verify[code].gID);
            if (!guild) { return res.status(404) }
            let member = await guild.members.fetch(client.verify[code].uID);
            if (!member) { return res.status(404) }
            if (member.roles.cache.has(client.verify[code].rID)) { return res.status(200) }
            await member.roles.add(client.verify[code].rID);

            let interaction = client.verify[code].interaction;
            if (interaction) {
                interaction.editReply({embeds: [new generateEmojiEmbed()
                    .setTitle("Verify")
                    .setDescription(`Verification complete`)
                    .setStatus("Success")
                    .setEmoji("MEMBER.JOIN")
                ], components: []});
            }
            res.status(200).send();
        } else {
            res.status(403).send();
        }
    });

    app.patch('/verify/:code', (req, res) => {
        const code = req.params.code;
        try {
            let interaction = client.verify[code].interaction;
            if (interaction) {
                interaction.editReply({embeds: [new generateEmojiEmbed()
                    .setTitle("Verify")
                    .setDescription(`Verify was opened in another tab or window, please complete the CAPTCHA there to continue`)
                    .setStatus("Success")
                    .setEmoji("MEMBER.JOIN")
                ]});
            }
        } catch {}
        res.status(200).send();
    })

    app.get('/verify/:code', jsonParser, function (req, res) {
        const code = req.params.code;
        if (client.verify[code]) {
            let data = structuredClone(client.verify[code])
            delete data.interaction;
            return res.status(200).send(data);
        }
        return res.status(404).send();
    })

    app.listen(port);
}

export default runServer;