const express = require('express');
const router = express.Router();
const db = require('../db');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const rateLimit = require('express-rate-limit');

if (!process.env.JWT_SECRET) {
  throw new Error('JWT_SECRET não definido no .env');
}

// limiter só para auth
const authLimiter = rateLimit({
  windowMs: 60 * 1000,
  max: 10,
  standardHeaders: true,
  legacyHeaders: false,
});

// POST /api/users/login
router.post('/login', authLimiter, async (req, res) => {
  const { username, password } = req.body;

  if (!username || !password) {
    return res
      .status(400)
      .json({ success: false, message: 'Usuário e senha são obrigatórios' });
  }

  try {
    const user = await db('users').where({ username }).first();

    if (!user) {
      return res
        .status(401)
        .json({ success: false, message: 'Credenciais inválidas' });
    }

    const isValidPassword = await bcrypt.compare(password, user.password);
    if (!isValidPassword) {
      return res
        .status(401)
        .json({ success: false, message: 'Credenciais inválidas' });
    }

    const token = jwt.sign(
      { id: user.id, username: user.username },
      process.env.JWT_SECRET,
      { expiresIn: '24h' }
    );

    return res.json({ success: true, data: { token } });
  } catch (err) {
    console.error('Erro ao autenticar usuário:', err);
    return res
      .status(500)
      .json({ success: false, message: 'Erro interno do servidor' });
  }
});

// POST /api/users/register
router.post('/register', authLimiter, async (req, res) => {
  const { username, password } = req.body;

  if (
    !username ||
    !password ||
    typeof username !== 'string' ||
    typeof password !== 'string' ||
    username.length < 3 ||
    password.length < 4
  ) {
    return res.status(400).json({
      success: false,
      message:
        'Nome de usuário deve ter pelo menos 3 caracteres e senha pelo menos 4 caracteres',
    });
  }

  try {
    const existing = await db('users').where({ username }).first();
    if (existing) {
      return res
        .status(409)
        .json({ success: false, message: 'Nome de usuário já está em uso' });
    }

    const hashedPassword = await bcrypt.hash(password, 10);

    const [row] = await db('users')
      .insert({ username, password: hashedPassword })
      .returning('id');

    const token = jwt.sign(
      { id: row.id, username },
      process.env.JWT_SECRET,
      { expiresIn: '24h' }
    );

    return res.status(201).json({ success: true, data: { token } });
  } catch (err) {
    console.error('Erro ao registrar usuário:', err);
    return res.status(500).json({
      success: false,
      message: 'Erro interno ao registrar usuário',
    });
  }
});

module.exports = router;
