const bcrypt = require('bcryptjs');

let db;

function init(database) { db = database; }

function setupRoutes(app, auth) {
    const { authenticateToken, requireAdmin } = auth;

    app.get('/api/admin/users', authenticateToken, requireAdmin, (req, res) => {
        db.all(`SELECT id, login, full_name, role, created_at FROM users ORDER BY id`, (err, rows) => {
            if (err) return res.status(500).json({ error: 'Ошибка БД' });
            res.json(rows);
        });
    });

    app.post('/api/admin/users', authenticateToken, requireAdmin, (req, res) => {
        const { login, password, full_name, role } = req.body;
        if (!login || !password) return res.status(400).json({ error: 'Логин и пароль обязательны' });
        const hash = bcrypt.hashSync(password, 10);
        const stmt = db.prepare(`INSERT INTO users (login, password_hash, full_name, role) VALUES (?, ?, ?, ?)`);
        stmt.run(login, hash, full_name || '', role || 'admin', function(err) {
            if (err) {
                if (err.message.includes('UNIQUE')) return res.status(409).json({ error: 'Пользователь с таким логином уже существует' });
                return res.status(500).json({ error: 'Ошибка создания' });
            }
            db.get(`SELECT id, login, full_name, role, created_at FROM users WHERE id = ?`, [this.lastID], (e2, row) => {
                res.status(201).json(row);
            });
        });
        stmt.finalize();
    });

    app.put('/api/admin/users/:id', authenticateToken, requireAdmin, (req, res) => {
        const id = parseInt(req.params.id);
        if (isNaN(id)) return res.status(400).json({ error: 'Неверный ID' });
        const { login, password, full_name, role } = req.body;

        if (password) {
            const hash = bcrypt.hashSync(password, 10);
            const stmt = db.prepare(`UPDATE users SET login = ?, password_hash = ?, full_name = ?, role = ? WHERE id = ?`);
            stmt.run(login, hash, full_name || '', role || 'admin', id, function(err) {
                if (err) return res.status(500).json({ error: 'Ошибка обновления' });
                if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' });
                db.get(`SELECT id, login, full_name, role, created_at FROM users WHERE id = ?`, [id], (e2, row) => {
                    res.json(row);
                });
            });
            stmt.finalize();
        } else {
            const stmt = db.prepare(`UPDATE users SET login = ?, full_name = ?, role = ? WHERE id = ?`);
            stmt.run(login, full_name || '', role || 'admin', id, function(err) {
                if (err) return res.status(500).json({ error: 'Ошибка обновления' });
                if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' });
                db.get(`SELECT id, login, full_name, role, created_at FROM users WHERE id = ?`, [id], (e2, row) => {
                    res.json(row);
                });
            });
            stmt.finalize();
        }
    });

    app.delete('/api/admin/users/:id', authenticateToken, requireAdmin, (req, res) => {
        const id = parseInt(req.params.id);
        if (isNaN(id)) return res.status(400).json({ error: 'Неверный ID' });
        if (id === req.user.id) return res.status(400).json({ error: 'Нельзя удалить самого себя' });

        const superadmin = process.env.ADMIN_USERNAME || 'admin';
        db.get(`SELECT login FROM users WHERE id = ?`, [id], (e1, row) => {
            if (row && row.login === superadmin) {
                return res.status(400).json({ error: 'Нельзя удалить суперадминистратора из .env' });
            }
            const stmt = db.prepare(`DELETE FROM users WHERE id = ?`);
            stmt.run(id, function(err) {
                if (err) return res.status(500).json({ error: 'Ошибка удаления' });
                if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' });
                res.json({ message: 'Пользователь удалён' });
            });
            stmt.finalize();
        });
    });
}

module.exports = { init, setupRoutes };
