const db = require('../database/db');

// Função para inserir um usuário no banco
function insertUser({ user_name, user_email, user_api_key }, callback) {
  const sql = `
    INSERT INTO "user" (user_name, user_email, user_api_key)
    VALUES ($1, $2, $3)
    RETURNING user_id `;
  const params = [user_name, user_email, user_api_key];

  // ALTERADO: 'result' agora é o 'res' completo da query do pg
  db.run(sql, params, function (err, result) {
    if (err) {
      console.error('Erro ao inserir usuário:', err.message);
      if (err.code === '23505') {
        return callback(new Error('Email ou API Key já existentes.'));
      }
      return callback(err);
    }
    if (result && result.rows && result.rows.length > 0) {
      callback(null, result.rows[0].user_id);
    } else {
      callback(new Error('Não foi possível obter o ID do novo usuário.'));
    }
  });
}

function updateUser(user_id, { user_name, user_email, user_api_key }, callback) {
  const sql = `
    UPDATE "user"
    SET
      user_name = $1, 
      user_email = $2, 
      user_api_key = $3
    WHERE user_id = $4
  `;
  const params = [user_name, user_email, user_api_key, user_id];

  // ALTERADO: 'result' agora é o 'res' completo da query do pg
  db.run(sql, params, function (err, result) {
    if (err) {
      console.error('Erro ao atualizar usuário:', err.message);
      if (err.code === '23505') {
        return callback(new Error('Email ou API Key já existentes.'));
      }
      return callback(err);
    }
    // ALTERADO: result.rowCount para o número de linhas afetadas
    callback(null, result.rowCount);
  });
}

/**
 * Remove um usuário do banco de dados pelo u_id.
 */
function deleteUser(user_id, callback) {
  const sql = 'DELETE FROM "user" WHERE user_id = $1'; // ALTERADO: user_id
  const params = [user_id];

  // ALTERADO: 'result' agora é o 'res' completo da query do pg
  db.run(sql, params, function (err, result) {
    if (err) {
      console.error('Erro ao remover usuário:', err.message);
      return callback(err);
    }
    // ALTERADO: result.rowCount para o número de linhas removidas
    callback(null, result.rowCount);
  });
}

function getAllUsers(callback) {
    const sql = `SELECT * FROM "user"`;
    db.all(sql, [], (err, rows) => {
      if (err) {
        console.error('Erro ao buscar usuários:', err.message);
        return callback(err);
      }
      callback(null, rows);
    });
}
  
/**
 * Retorna um usuário pelo ID.
 */
function getUserById(user_id, callback) {
    const sql = `SELECT * FROM "user" WHERE user_id = $1`; // ALTERADO: user_id
    db.get(sql, [user_id], (err, row) => {
      if (err) {
        console.error('Erro ao buscar usuário:', err.message);
        return callback(err);
      }
      callback(null, row);
    });
}

// ADICIONADO: Função getUserByApiKey que vi que é usada em outros modelos
function getUserByApiKey(user_api_key, callback) {
  const sql = `SELECT * FROM "user" WHERE user_api_key = $1`; // ALTERADO: user_api_key
  db.get(sql, [user_api_key], callback);
}

module.exports = {
  insertUser,
  updateUser,
  deleteUser,
  getAllUsers,
  getUserById,
  getUserByApiKey
};