const { Events, MessageFlags } = require('discord.js')
require('dotenv').config()
const { client, mClient } = require('../index')
const prefix = process.env.D_Prefix
const db = mClient.db(process.env.M_DB)

module.exports = {
    name: Events.MessageCreate,
    once: false,
    async execute(message) {
        if (message.author.bot) { return }

        // Erster/Zweiter/Dritter Handler
        if (message.channelId === '353902391021535244' || message.channelId === '471058991481487361') {
            const numbered = {
                Erst: "Ersti",
                Zweit: "Zweiti",
                Dritt: "Dritti"
            };

            const found = Object.entries(numbered).find(([stem]) =>
                new RegExp(`\\b${stem}\\w*\\b`, "i").test(message.content)
            )?.[1];

            if (!found) return;

            const numberedColl = db.collection('items_daily_numbers');
            const today = new Date().toLocaleDateString("en-CA", {
                timeZone: "Europe/Berlin"
            });

            // Tages-Dokument sicherstellen
            await numberedColl.findOneAndUpdate(
                { date: today },
                {
                    $setOnInsert: {
                        date: today,
                        positions: {
                            Ersti: null,
                            Zweiti: null,
                            Dritti: null
                        }
                    }
                },
                { upsert: true }
            );

            // 🔒 Atomarer Claim:
            // - Position muss frei sein
            // - User darf noch keine Position heute haben
            const result = await numberedColl.findOneAndUpdate(
                {
                    date: today,
                    [`positions.${found}`]: null,

                    "positions.Ersti.userId": { $ne: message.author.id },
                    "positions.Zweiti.userId": { $ne: message.author.id },
                    "positions.Dritti.userId": { $ne: message.author.id }
                },
                {
                    $set: {
                        [`positions.${found}`]: {
                            userId: message.author.id,
                            timestamp: new Date()
                        }
                    }
                },
                { returnDocument: "after" }
            );

            // ❌ bereits vergeben oder schon eine Position
            if (!result) {
                return message.reply({
                    content: `❌ Du kannst pro Tag nur eine Position beanspruchen, und sie muss noch frei sein.`,
                    flags: MessageFlags.Ephemeral
                });
            }

            // ✅ Erfolg
            return message.reply({
                content: `✅ Du bist ${found}! :point_right: :point_left: <@${message.author.id}>`,
                flags: MessageFlags.Ephemeral
            });
        }

        // Command Handler
        const args = message.content.slice(prefix.length).trim().split(/ +/);
        if (!message.content.startsWith(prefix)) return;

        const cmd = args.shift().toLowerCase();
        let command = client.legacyCommands.get(cmd)


        if (!command) command = client.legacyCommands.get(client.aliases.get(cmd))
        if (!command) return
        try {
            client.legacyCommands.get(command.name).execute(message, args)
        } catch (error) {
            console.error(error)
        }

    }
}
