// api-user-lists.js - API для управления пользовательскими списками
const express = require('express');
const router = express.Router();

module.exports = function(app, db) {
    // Middleware для проверки аутентификации
    const requireAuth = (req, res, next) => {
        if (!req.session || !req.session.user) {
            return res.status(401).json({ error: 'Требуется аутентификация' });
        }
        next();
    };

    // GET /api/user/lists – получить все списки текущего пользователя
    router.get('/api/user/lists', requireAuth, (req, res) => {
        const userId = req.session.user.id;

        db.all(
            'SELECT id, name, user_ids, created_at, updated_at FROM user_lists WHERE user_id = ? ORDER BY created_at DESC',
            [userId],
            (err, rows) => {
                if (err) {
                    console.error('❌ Ошибка получения списков:', err);
                    return res.status(500).json({ error: 'Ошибка получения списков' });
                }

                // Преобразуем user_ids из JSON в массив
                const lists = (rows || []).map(row => ({
                    ...row,
                    user_ids: JSON.parse(row.user_ids || '[]')
                }));

                res.json(lists);
            }
        );
    });

    // POST /api/user/lists – создать новый список
    router.post('/api/user/lists', requireAuth, (req, res) => {
        const userId = req.session.user.id;
        const { name, userIds } = req.body;

        if (!name || name.trim() === '') {
            return res.status(400).json({ error: 'Название списка обязательно' });
        }
        if (name.length > 35) {
            return res.status(400).json({ error: 'Название не должно превышать 35 символов' });
        }
        if (!Array.isArray(userIds)) {
            return res.status(400).json({ error: 'userIds должен быть массивом' });
        }

        const user_ids_json = JSON.stringify(userIds);

        db.run(
            'INSERT INTO user_lists (user_id, name, user_ids) VALUES (?, ?, ?)',
            [userId, name.trim(), user_ids_json],
            function(err) {
                if (err) {
                    console.error('❌ Ошибка создания списка:', err);
                    return res.status(500).json({ error: 'Ошибка создания списка' });
                }

                // Возвращаем созданный список
                db.get(
                    'SELECT id, name, user_ids, created_at, updated_at FROM user_lists WHERE id = ?',
                    [this.lastID],
                    (err, row) => {
                        if (err) {
                            return res.status(500).json({ error: 'Список создан, но ошибка получения' });
                        }
                        const newList = {
                            ...row,
                            user_ids: JSON.parse(row.user_ids || '[]')
                        };
                        res.status(201).json(newList);
                    }
                );
            }
        );
    });

    // PUT /api/user/lists/:id – обновить список
    router.put('/api/user/lists/:id', requireAuth, (req, res) => {
        const listId = req.params.id;
        const userId = req.session.user.id;
        const { name, userIds } = req.body;

        // Проверяем, принадлежит ли список пользователю
        db.get('SELECT id FROM user_lists WHERE id = ? AND user_id = ?', [listId, userId], (err, list) => {
            if (err) {
                console.error('❌ Ошибка проверки списка:', err);
                return res.status(500).json({ error: 'Ошибка доступа' });
            }
            if (!list) {
                return res.status(404).json({ error: 'Список не найден' });
            }

            const updates = [];
            const params = [];

            if (name !== undefined) {
                if (name.trim() === '') {
                    return res.status(400).json({ error: 'Название не может быть пустым' });
                }
                if (name.length > 35) {
                    return res.status(400).json({ error: 'Название не должно превышать 35 символов' });
                }
                updates.push('name = ?');
                params.push(name.trim());
            }

            if (userIds !== undefined) {
                if (!Array.isArray(userIds)) {
                    return res.status(400).json({ error: 'userIds должен быть массивом' });
                }
                updates.push('user_ids = ?');
                params.push(JSON.stringify(userIds));
            }

            if (updates.length === 0) {
                return res.status(400).json({ error: 'Нет данных для обновления' });
            }

            updates.push('updated_at = CURRENT_TIMESTAMP');
            params.push(listId);

            const query = `UPDATE user_lists SET ${updates.join(', ')} WHERE id = ?`;

            db.run(query, params, function(err) {
                if (err) {
                    console.error('❌ Ошибка обновления списка:', err);
                    return res.status(500).json({ error: 'Ошибка обновления списка' });
                }

                // Возвращаем обновлённый список
                db.get(
                    'SELECT id, name, user_ids, created_at, updated_at FROM user_lists WHERE id = ?',
                    [listId],
                    (err, row) => {
                        if (err) {
                            return res.status(500).json({ error: 'Список обновлён, но ошибка получения' });
                        }
                        const updatedList = {
                            ...row,
                            user_ids: JSON.parse(row.user_ids || '[]')
                        };
                        res.json(updatedList);
                    }
                );
            });
        });
    });

    // DELETE /api/user/lists/:id – удалить список
    router.delete('/api/user/lists/:id', requireAuth, (req, res) => {
        const listId = req.params.id;
        const userId = req.session.user.id;

        db.run(
            'DELETE FROM user_lists WHERE id = ? AND user_id = ?',
            [listId, userId],
            function(err) {
                if (err) {
                    console.error('❌ Ошибка удаления списка:', err);
                    return res.status(500).json({ error: 'Ошибка удаления списка' });
                }
                if (this.changes === 0) {
                    return res.status(404).json({ error: 'Список не найден' });
                }
                res.json({ success: true, message: 'Список удалён' });
            }
        );
    });

    // Подключаем роутер к приложению
    app.use(router);
    console.log('✅ API для пользовательских списков подключено');
};