public IActionResult GetConviteByVagaId(long vagaId, long usuarioId)
        {
            Usuario usuario = _usuarioRepository.GetById(usuarioId);

            // Caso não encontre
            if (usuario == null)
            {
                return(StatusCode(404, "Usuário não encontrado"));
            }

            // Busca usuarioCandidato por UsuarioId
            var UsuarioCandidato = _usuarioCandidatoAlunoRepository.GetByUsuarioId(usuario.Id);

            // Caso não encontre
            if (UsuarioCandidato == null)
            {
                return(StatusCode(404, "Este usuário não é um candidato para receber convites."));
            }

            // Busca vaga por Id
            Vaga vaga = _vagaRepository.GetById(vagaId);

            // Caso não encontre
            if (vaga == null)
            {
                return(StatusCode(404, "Vaga não encontrada"));
            }

            // Busca usuarioEmpresa por usuarioEmpresaId
            var usuarioEmpresa = _usuarioEmpresaRepository.GetById(vaga.UsuarioEmpresaId);

            // Caso não encontre
            if (usuarioEmpresa == null)
            {
                return(StatusCode(404, "Este usuário não tem um perfil de empresa."));
            }

            // Busca empresa por Id e retorna apenas o nome da mesma
            var NomeEmpresa = _empresaRepository.GetById(usuarioEmpresa.EmpresaId).Nome;

            // Busca convite por vagaId e UsuarioId
            ConviteEntrevista convite = _conviteEntrevistaRepository.GetConviteEntrevistasByVagaIdAndCandidatoId(vagaId, UsuarioCandidato.Id);

            // Caso não encontre
            if (convite == null)
            {
                return(StatusCode(404, "Convite não encontrado"));
            }

            //Busca endereço da vaga
            Endereco endereco = _enderecoRepository.GetById(convite.EnderecoId);

            //Busca município da vaga
            Municipio municipio = _enderecoRepository.GetMunicipioById(endereco.MunicipioId);

            //Busca UfSigla da vaga
            UfSigla ufSigla = _enderecoRepository.GetUfSiglaById(municipio.UfSiglaId);

            // Cria o ViewModel de convite entrevista "diferente"
            ConviteEntrevistaViewModel conviteEntrevistaViewModel = null;

            try
            {
                conviteEntrevistaViewModel = new ConviteEntrevistaViewModel(convite.Id, NomeEmpresa, convite.DataHoraEntrevista, endereco.Logradouro, endereco.Bairro, endereco.Numero, municipio.Descricao, ufSigla.UFSigla, convite.InfosComplementares);
            }
            catch (Exception)
            {
                return(StatusCode(500, "Houve um erro interno ao criar um novo endereco"));
            }

            return(StatusCode(200, conviteEntrevistaViewModel));
        }
        public async Task <IActionResult> CadastrarConvite(CriarConviteInput input, long vagaId, long usuarioCandidatoId)
        {
            // Busca usuarioCandidato por Id
            var usuarioCandidatoDb = _usuarioCandidatoAlunoRepository.GetById(usuarioCandidatoId);

            // Caso não encontrar
            if (usuarioCandidatoDb == null)
            {
                return(StatusCode(400, "Este usuário não é um candidato."));
            }

            // Busca vaga por Id
            var vagaDb = _vagaRepository.GetById(vagaId);

            // Caso não encontre
            if (vagaDb == null)
            {
                return(StatusCode(400, "Esta vaga não existe"));
            }

            // Busca Inscricao por vagaId e UsuarioCandidatoAlunoId
            var inscricaoDb = _inscricaoRepository.GetInscricaoByVagaIdAndCandidatoIdAtual(vagaId, usuarioCandidatoDb.Id);

            // Caso não encontre
            if (inscricaoDb == null)
            {
                return(StatusCode(400, "Não existe uma inscrição."));
            }

            // Busca Municipio por Id
            var municipioDb = _enderecoRepository.GetMunicipioById(input.Municipio.Id);

            // Caso não encontre
            if (municipioDb == null)
            {
                return(StatusCode(404, $"O município de [{input.Municipio.Descricao}] não existe no banco de dados."));
            }

            try
            {
                // Altera para convite recebido na entidade Inscricao
                inscricaoDb.AlterarConviteRecebido();

                // Altera no BD
                _inscricaoRepository.UpdateInscricao(inscricaoDb);
            }
            catch (Exception)
            {
                return(StatusCode(500, "Houve um erro interno ao alterar a inscrição específica."));
            }

            // Cria endereço da entrevista
            Endereco endereco = null;

            try
            {
                endereco = new Endereco(input.Bairro, input.Rua, input.Numero, input.Municipio.Id);
            }
            catch (Exception)
            {
                return(StatusCode(500, "Houve um erro interno ao criar um novo endereco"));
            }

            // Cria no BD
            endereco = _enderecoRepository.Create(endereco);

            // Cria convite de entrevista
            ConviteEntrevista convite = null;

            try
            {
                convite = new ConviteEntrevista(input.DataHoraEntrevista, input.infosComplementares, endereco.Id, usuarioCandidatoDb.Id, vagaDb.Id);
            }
            catch (Exception)
            {
                return(StatusCode(500, "Houve um erro interno ao criar um novo convite."));
            }

            // Cria no BD
            _conviteEntrevistaRepository.Create(convite);

            //TODO: Notificar candidato que recebeu um convite de entrevista pelo EMAIL

            // Salva alterações no BD
            await _conviteEntrevistaRepository.UnitOfWork.SaveDbChanges();

            return(StatusCode(200, "O Convite foi criado com sucesso!"));
        }