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

/**
 * Insere um novo investment_type.
 * @param {string} investment_type_name - Nome do tipo de investimento
 * @param {function} callback (err, lastID)
 */
function insertInvestmentType(investment_type_name, callback) {
  const sql = `
    INSERT INTO investment_type (investment_type_name)
    VALUES ($1)
    RETURNING investment_type_id
  `;
  db.run(sql, [investment_type_name], function (err, result) { // 'result' contém os dados retornados pelo RETURNING
    if (err) {
      console.error('Erro ao inserir investment_type:', err.message);
      // Tratamento de erro para UNIQUE constraint violation (PostgreSQL erro '23505')
      if (err.code === '23505') {
        return callback(new Error('Já existe um tipo de investimento com esse nome.'));
      }
      return callback(err);
    }
    // ALTERADO: O ID vem de result.rows[0].investment_type_id em vez de this.lastID
    callback(null, result.rows[0].investment_type_id);
  });
}

/**
 * Atualiza um registro da tabela investment_type.
 * @param {number} investment_type_id - ID do tipo de investimento a atualizar
 * @param {string} investment_type_name - Novo nome
 * @param {function} callback (err, changes)
 */
function updateInvestmentType(investment_type_id, investment_type_name, callback) {
  // 1) Verifica se já existe outro registro com o mesmo nome

  const checkSql = `
    SELECT investment_type_id FROM investment_type
    WHERE investment_type_name = $1 AND investment_type_id != $2
  `;

  db.get(checkSql, [investment_type_name, investment_type_id], (err, row) => {
    if (err) {
      console.error('Erro ao verificar unicidade:', err.message);
      return callback(err);
    }

    if (row) {
      // Já existe um nome igual com outro ID
      return callback(new Error('Já existe um investment_type com esse nome.'));
    }

    // Se passou na verificação, faz o update

    const updateSql = `
      UPDATE investment_type
      SET investment_type_name = $1
      WHERE investment_type_id = $2
    `;

    db.run(updateSql, [investment_type_name, investment_type_id], function (err, result) { // 'result' é o segundo argumento
      if (err) {
        console.error('Erro ao atualizar investment_type:', err.message);
        return callback(err);
      }
      // ALTERADO: this.changes para result.rowCount
      callback(null, result.rowCount); // número de linhas afetadas
    });
  });
}


/**
 * Remove um registro da tabela investment_type.
 * @param {number} investment_type_id - ID do tipo de investimento a remover
 * @param {function} callback (err, changes)
 */
function deleteInvestmentType(investment_type_id, callback) {

  const sql = `
    DELETE FROM investment_type
    WHERE investment_type_id = $1
  `;
  db.run(sql, [investment_type_id], function (err, result) { // 'result' é o segundo argumento
    if (err) {
      console.error('Erro ao remover investment_type:', err.message);
      return callback(err);
    }
    // ALTERADO: this.changes para result.rowCount
    callback(null, result.rowCount); // número de linhas removidas
  });
}

function getAllInvestmentTypes(callback) {
    const sql = `SELECT * FROM investment_type`;
    db.all(sql, [], (err, rows) => {
      if (err) {
        console.error('Erro ao buscar investment_type:', err.message);
        return callback(err);
      }
      callback(null, rows);
    });
}
  
/**
 * Retorna um tipo de investimento pelo ID.
 * @param {number} investment_type_id
 * @param {function} callback (err, row)
 */
function getInvestmentTypeById(investment_type_id, callback) {
    
    const sql = `SELECT * FROM investment_type WHERE investment_type_id = $1`;
    db.get(sql, [investment_type_id], (err, row) => {
      if (err) {
        console.error('Erro ao buscar investment_type:', err.message);
        return callback(err);
      }
      callback(null, row); // row será undefined se não encontrar
    });
}

/**
* Retorna um tipo de investimento pelo nome.
* @param {string} investment_type_name
* @param {function} callback (err, row)
*/
function getInvestmentTypeByName(investment_type_name, callback) {
  
  const sql = `SELECT * FROM investment_type WHERE investment_type_name = $1`;
  db.get(sql, [investment_type_name], (err, row) => {
    if (err) {
      console.error('Erro ao buscar investment_type por nome:', err.message);
      return callback(err);
    }
    callback(null, row); // row será undefined se não encontrar
  });
}
 
module.exports = {
  insertInvestmentType,
  updateInvestmentType,
  deleteInvestmentType,
  getAllInvestmentTypes,
  getInvestmentTypeById,
  getInvestmentTypeByName
};