/**
 * auth.js — rota de login, /me
 */
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const db = require('../db');
const { requireAuth } = require('../middleware/auth');

const JWT_SECRET = process.env.JWT_SECRET || 'ILVD-JWT-SECRET-MUDE-ISSO-2024';

/**
 * POST /api/admin/login
 * Body: { username, password }
 */
router.post('/login', async (req, res) => {
    const { username, password } = req.body;
    if (!username || !password) {
        return res.status(400).json({ error: 'Usuário e senha obrigatórios' });
    }

    try {
        const [rows] = await db.execute('SELECT * FROM users WHERE username = ?', [username.trim()]);
        const user = rows[0];

        if (!user) {
            return res.status(401).json({ error: 'Usuário ou senha inválidos' });
        }

        if (user.is_active === 0 || user.is_active === false) {
            return res.status(403).json({ error: 'Sua conta está desativada. Entre em contato com o suporte.' });
        }

        const valid = bcrypt.compareSync(password, user.password_hash);
        if (!valid) {
            return res.status(401).json({ error: 'Usuário ou senha inválidos' });
        }

        const token = jwt.sign(
            { id: user.id, username: user.username, role: user.role },
            JWT_SECRET,
            { expiresIn: '30d' }
        );

        res.json({
            token,
            user: {
                id: user.id,
                username: user.username,
                role: user.role,
                credits: user.credits,
                has_seen_tutorial: !!user.has_seen_tutorial
            }
        });
    } catch (err) {
        console.error('❌ Login error:', err);
        res.status(500).json({ error: 'Erro interno no servidor' });
    }
});

/**
 * PATCH /api/admin/change-password
 * Body: { currentPassword, newPassword }
 */
router.patch('/change-password', requireAuth, async (req, res) => {
    const { currentPassword, newPassword } = req.body;
    const userId = req.user.id;

    if (!currentPassword || !newPassword) {
        return res.status(400).json({ error: 'Senha atual e nova senha são obrigatórias' });
    }

    if (newPassword.length < 6) {
        return res.status(400).json({ error: 'A nova senha deve ter pelo menos 6 caracteres' });
    }

    try {
        const [rows] = await db.execute('SELECT password_hash FROM users WHERE id = ?', [userId]);
        const user = rows[0];

        if (!user) {
            return res.status(404).json({ error: 'Usuário não encontrado' });
        }

        const valid = bcrypt.compareSync(currentPassword, user.password_hash);
        if (!valid) {
            return res.status(401).json({ error: 'Senha atual incorreta' });
        }

        const newHash = bcrypt.hashSync(newPassword, 10);
        await db.execute('UPDATE users SET password_hash = ? WHERE id = ?', [newHash, userId]);

        res.json({ success: true, message: 'Senha alterada com sucesso!' });
    } catch (err) {
        console.error('❌ Change password error:', err);
        res.status(500).json({ error: 'Erro interno no servidor' });
    }
});

/**
 * PATCH /api/admin/change-username
 * Body: { newUsername, password }
 */
router.patch('/change-username', requireAuth, async (req, res) => {
    const { newUsername, password } = req.body;
    const userId = req.user.id;

    if (!newUsername || !password) {
        return res.status(400).json({ error: 'Novo usuário e senha atual são obrigatórios' });
    }

    const trimmedUsername = newUsername.trim();
    if (trimmedUsername.length < 3) {
        return res.status(400).json({ error: 'O nome de usuário deve ter pelo menos 3 caracteres' });
    }

    try {
        console.log(`[DEBUG] Change username request: userId=${userId}, newUsername=${trimmedUsername}`);
        // 1. Verificar senha atual
        const [rows] = await db.execute('SELECT password_hash, username FROM users WHERE id = ?', [userId]);
        const user = rows[0];

        if (!user) {
            console.log(`[DEBUG] User not found: id=${userId}`);
            return res.status(404).json({ error: 'Usuário não encontrado' });
        }

        const valid = bcrypt.compareSync(password, user.password_hash);
        if (!valid) {
            console.log(`[DEBUG] Invalid password for username change: userId=${userId}`);
            return res.status(401).json({ error: 'Senha incorreta para confirmar alteração' });
        }

        // 2. Verificar se o novo username já existe (se for diferente do atual)
        if (trimmedUsername.toLowerCase() !== user.username.toLowerCase()) {
            const [existing] = await db.execute('SELECT id FROM users WHERE username = ?', [trimmedUsername]);
            if (existing.length > 0) {
                console.log(`[DEBUG] Username already in use: ${trimmedUsername}`);
                return res.status(400).json({ error: 'Este nome de usuário já está em uso' });
            }
        }

        // 3. Atualizar
        console.log(`[DEBUG] Updating username: ${user.username} -> ${trimmedUsername}`);
        await db.execute('UPDATE users SET username = ? WHERE id = ?', [trimmedUsername, userId]);

        res.json({ success: true, message: 'Usuário alterado com sucesso! Você precisará logar novamente.' });
    } catch (err) {
        console.error('❌ Change username error:', err);
        res.status(500).json({ error: 'Erro interno no servidor' });
    }
});

/**
 * GET /api/admin/me — retorna dados do usuário logado com os créditos atualizados
 */
router.get('/me', requireAuth, async (req, res) => {
    try {
        const [rows] = await db.execute('SELECT id, username, role, credits, has_seen_tutorial FROM users WHERE id = ?', [req.user.id]);
        const dbUser = rows[0];

        if (!dbUser) {
            return res.status(404).json({ error: 'Usuário não encontrado' });
        }

        if (dbUser.is_active === 0 || dbUser.is_active === false) {
            return res.status(401).json({ error: 'Sua conta foi desativada' });
        }

        res.json({ user: dbUser });
    } catch (err) {
        console.error('❌ Get /me error:', err);
        res.status(500).json({ error: 'Erro interno no servidor' });
    }
});

/**
 * POST /api/admin/complete-tutorial — marca que o usuário já viu o tutorial inicial
 */
router.post('/complete-tutorial', requireAuth, async (req, res) => {
    try {
        await db.execute('UPDATE users SET has_seen_tutorial = TRUE WHERE id = ?', [req.user.id]);
        res.json({ success: true, message: 'Tutorial marcado como visto' });
    } catch (err) {
        console.error('❌ complete-tutorial error:', err);
        res.status(500).json({ error: 'Erro interno no servidor' });
    }
});

module.exports = router;
