const db = require("../config/db");
const Notification = require("../utils/notification.js");

function lockingStand(user, data) {
    return new Promise((resolve, reject) => {
        const sheepId = Number(data.sheep_id) || null;

        if (!user.possibilities.can_view_stand) {
            return reject(new Error("Forbidden: no rights to view stand"));
        }
        if ((sheepId !== user.id && sheepId !== null) && !user.possibilities.can_manager_stand) {
            return reject(new Error("Forbidden: no rights to view stand"));
        }

        resolve({ update: "ok", id: data.id });
    });
}

function unlockingStand(user, data) {
    return new Promise((resolve, reject) => {
        const sheepId = Number(data.sheep_id) || null;

        if (!user.possibilities.can_view_stand) {
            return reject(new Error("Forbidden: no rights to view stand"));
        }
        if ((sheepId !== user.id && sheepId !== null) && !user.possibilities.can_manager_stand) {
            return reject(new Error("Forbidden: no rights to view stand"));
        }

        resolve({ update: "ok", id: data.id });
    });
}

function updateStand(user, data) {
    return new Promise((resolve, reject) => {
        const sheepId = Number(data.sheep_id) || null;

        if (!user.possibilities.can_view_stand) {
            return reject(new Error("Forbidden: no rights to view stand"));
        }
        if ((sheepId !== user.id && sheepId !== null) && !user.possibilities.can_manager_stand) {
            return reject(new Error("Forbidden: no rights to view stand"));
        }

        const sql = `
            UPDATE stand_schedule 
            SET sheep_id = ?, updated_at = ? 
            WHERE id = ?`;

        db.run(sql, [sheepId, Date.now(), data.id], function (err) {
            if (err) return reject(err);
            if (this.changes === 0) return reject(new Error("Stand not found"));

            const insertSql = `
                INSERT INTO stand_schedule_history 
                (stand_schedule_id, sheep_id, editor, created_at) 
                VALUES (?, ?, ?, ?)`;

            db.run(insertSql, [Number(data.id), sheepId, user.id, Date.now()], function (err) {
                if (err) return reject(err);

                if (sheepId === null) {
                    let text = [
                        'Звільнилося місце на одному зі стендів. Хто перший — той встигне 😉',
                        'Є одне вільне місце на стенді. Запис відкрито — не проґавте 😉',
                        'У одного зі стендів з’явилося вільне місце. Встигніть записатися!',
                        'Раптова можливість! На стенді є вільне місце. Забронюйте його зараз 📋',
                        'Одне місце стало вільним. Можливо, це саме ваше? 😉',
                        'Стенд чекає нового учасника. Вільне місце вже доступне 📋',
                        'Є шанс приєднатися — одне місце звільнилося 😊',
                        'Вільне місце на стенді довго не чекатиме. Записуйтеся!',
                        'Оголошуємо міні-набір: доступне одне місце на стенді.',
                        'Щойно звільнилося місце. Хто швидший — той з нами 🚀',
                        'З’явилася можливість долучитися до стенду. Кількість місць обмежена!',
                        'Останнє вільне місце на стенді шукає свого власника.'
                    ];
                    let randomMessage = text[Math.floor(Math.random() * text.length)];

                    Notification.sendStand({
                        title: "Звільнилось місце",
                        body: randomMessage,
                        page: `/stand/card/${data.stand_id}`
                    });
                }

                resolve({ update: "ok", id: data.id, historyId: this.lastID });
            });
        });
    });
}

module.exports = { lockingStand, unlockingStand, updateStand };