// src/controllers/investmentTypeController.js
const investmentTypeModel = require('../models/investmentTypeModel');

/**
 * Cria um novo investment_type
 * POST /investment-types
 */
const createInvestmentType = (req, res) => {
  const { investment_type_name } = req.body;

  if (!investment_type_name) {
    return res.status(400).json({ error: 'Campo obrigatório: investment_type_name.' });
  }

  // Verifica se já existe um tipo de investimento com o mesmo nome
  investmentTypeModel.getInvestmentTypeByName(investment_type_name, (err, existingType) => {
    if (err) {
      return res.status(500).json({ error: 'Erro ao verificar investment_type existente.' });
    }

    if (existingType) {
      return res.status(400).json({ error: 'Já existe um investment_type com esse nome.' });
    }

    // Se não existir, insere normalmente
    investmentTypeModel.insertInvestmentType(investment_type_name, (err, newId) => {
      if (err) {
        return res.status(500).json({ error: 'Erro ao criar investment_type.' });
      }
      return res.status(201).json({
        message: 'investment_type criado com sucesso!',
        investment_type_id: newId
      });
    });
  });
};


/**
 * Atualiza um investment_type
 * PUT /investment-types/:id
 */
const updateInvestmentType = (req, res) => {
  const investment_type_id = parseInt(req.params.id, 10);
  const { investment_type_name } = req.body;

  if (!investment_type_id) {
    return res.status(400).json({ error: 'ID inválido na URL.' });
  }
  if (!investment_type_name) {
    return res.status(400).json({ error: 'Campo obrigatório: investment_type_name.' });
  }

  investmentTypeModel.updateInvestmentType(investment_type_id, investment_type_name, (err, changes) => {
    if (err) {
      if (err.message === 'Já existe um investment_type com esse nome.') {
        return res.status(400).json({ error: err.message });
      }
      return res.status(500).json({ error: 'Erro ao atualizar investment_type.' });
    }

    if (changes === 0) {
      return res.status(404).json({ error: 'investment_type não encontrado ou sem alterações.' });
    }

    return res.json({ message: 'investment_type atualizado com sucesso!' });
  });
};


/**
 * Remove um investment_type
 * DELETE /investment-types/:id
 */
const deleteInvestmentType = (req, res) => {
  const investment_type_id = parseInt(req.params.id, 10);

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

  investmentTypeModel.deleteInvestmentType(investment_type_id, (err, changes) => {
    if (err) {
      return res.status(500).json({ error: 'Erro ao remover investment_type.' });
    }
    if (changes === 0) {
      return res.status(404).json({ error: 'investment_type não encontrado.' });
    }
    return res.json({ message: 'investment_type removido com sucesso!' });
  });
};

/**
 * GET /investment-types -> Lista todos
 */
const getAllInvestmentTypes = (req, res) => {
    investmentTypeModel.getAllInvestmentTypes((err, types) => {
      if (err) {
        return res.status(500).json({ error: 'Erro ao buscar tipos de investimento.' });
      }
      return res.json(types);
    });
  };
  
  /**
   * GET /investment-types/:id -> Retorna um específico
   */
  const getInvestmentTypeById = (req, res) => {
    const investment_type_id = parseInt(req.params.id, 10);
  
    if (!investment_type_id) {
      return res.status(400).json({ error: 'ID inválido.' });
    }
  
    investmentTypeModel.getInvestmentTypeById(investment_type_id, (err, type) => {
      if (err) {
        return res.status(500).json({ error: 'Erro ao buscar tipo de investimento.' });
      }
      if (!type) {
        return res.status(404).json({ error: 'Tipo de investimento não encontrado.' });
      }
      return res.json(type);
    });
  };
  
  module.exports = {
    // já existentes
    createInvestmentType,
    updateInvestmentType,
    deleteInvestmentType,
    // novas
    getAllInvestmentTypes,
    getInvestmentTypeById
  };