// src/controllers/userController.js

const validarEmail = (email) => {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(email);
};

const userModel = require('../models/userModel');

const createUser = (req, res) => {
  let { user_name, user_email, user_api_key } = req.body;

  if (!user_name || !user_email || !user_api_key) {
    return res.status(400).json({ error: 'Campos obrigatórios: user_name, user_email, user_api_key.' });
  }

  user_email = user_email.toLowerCase(); // Padroniza para minúsculo

  if (!validarEmail(user_email)) {
    return res.status(400).json({ error: 'E-mail inválido.' });
  }

  userModel.insertUser({ user_name, user_email, user_api_key }, (err, newUserId) => {
    if (err) {
      return res.status(500).json({ error: 'Erro ao inserir usuário.' });
    }

    return res.status(201).json({
      message: 'Usuário criado com sucesso!',
      userId: newUserId
    });
  });
};


// Atualiza um usuário (PUT /users/:id)
const updateUser = (req, res) => {
  const user_id = parseInt(req.params.id, 10);
  let { user_name, user_email, user_api_key } = req.body;

  if (!user_id) {
    return res.status(400).json({ error: 'É necessário informar um ID válido na URL.' });
  }

  if (!user_name || !user_email || !user_api_key) {
    return res.status(400).json({ error: 'Campos obrigatórios: user_name, user_email, user_api_key.' });
  }

  user_email = user_email.toLowerCase();

  if (!validarEmail(user_email)) {
    return res.status(400).json({ error: 'E-mail inválido.' });
  }

  userModel.updateUser(user_id, { user_name, user_email, user_api_key }, (err, changes) => {
    if (err) {
      return res.status(500).json({ error: 'Erro ao atualizar usuário.' });
    }
    if (changes === 0) {
      return res.status(404).json({ error: 'Usuário não encontrado ou sem alterações.' });
    }
    return res.json({ message: 'Usuário atualizado com sucesso!' });
  });
};

// Remove um usuário (DELETE /users/:id)
const deleteUser = (req, res) => {
  const user_id = parseInt(req.params.id, 10);

  if (!user_id) {
    return res.status(400).json({ error: 'É necessário informar um ID válido na URL.' });
  }

  // Chama o model para remover
  userModel.deleteUser(user_id, (err, changes) => {
    if (err) {
      return res.status(500).json({ error: 'Erro ao remover usuário.' });
    }
    if (changes === 0) {
      return res.status(404).json({ error: 'Usuário não encontrado.' });
    }
    return res.json({ message: 'Usuário removido com sucesso!' });
  });
};

/**
 * GET /users -> Retorna todos os usuários
 */
const getAllUsers = (req, res) => {
  userModel.getAllUsers((err, users) => {
    if (err) {
      return res.status(500).json({ error: 'Erro ao buscar usuários.' });
    }
    return res.json(users);
  });
};

/**
 * GET /users/:id -> Retorna um usuário específico
 */
const getUserById = (req, res) => {
  const user_id = parseInt(req.params.id, 10);

  if (!user_id) {
    return res.status(400).json({ error: 'ID inválido.' });
  }

  userModel.getUserById(user_id, (err, user) => {
    if (err) {
      return res.status(500).json({ error: 'Erro ao buscar usuário.' });
    }
    if (!user) {
      return res.status(404).json({ error: 'Usuário não encontrado.' });
    }
    return res.json(user);
  });
};

module.exports = {
  // já existentes
  createUser,
  updateUser,
  deleteUser,
  // novas
  getAllUsers,
  getUserById
};
