public bool Remove(int id)
        {
            var _hardwareSalaService = new HardwareDeSalaService(_context);
            var _minhaSalaService    = new SalaParticularService(_context);
            var _horarioSalaService  = new HorarioSalaService(_context);
            var _planejamentoService = new PlanejamentoService(_context);

            try
            {
                if (_hardwareSalaService.GetByIdSala(id).Count == 0 && _minhaSalaService.GetByIdSala(id).Count == 0 &&
                    _horarioSalaService.GetByIdSala(id).Count == 0 && _planejamentoService.GetByIdSala(id).Count == 0)
                {
                    var x = _context.Sala.Where(s => s.Id == id).FirstOrDefault();
                    if (x != null)
                    {
                        _context.Remove(x);
                        return(_context.SaveChanges() == 1);
                    }
                }
                else
                {
                    throw new ServiceException("Essa sala nao pode ser removida pois existem outros registros associados a ela!");
                }
            }
            catch (Exception e) { throw e; }

            return(false);
        }
        public bool InsertSalaWithHardwares(SalaAuxModel sala, int idUsuario)
        {
            using (var transaction = _context.Database.BeginTransaction())
            {
                try
                {
                    var salaInserida = Insert(new SalaModel {
                        Id = sala.Sala.Id, Titulo = sala.Sala.Titulo, BlocoId = sala.Sala.BlocoId
                    });
                    if (salaInserida == null)
                    {
                        throw new ServiceException("Houve um problema ao cadastrar sala, tente novamente em alguns minutos!");
                    }

                    var _monitoramentoService = new MonitoramentoService(_context);
                    _monitoramentoService.Insert(new MonitoramentoModel {
                        Luzes = false, ArCondicionado = false, SalaId = salaInserida.Id
                    });

                    if (sala.HardwaresSala.Count > 0)
                    {
                        var _hardwareDeSalaService = new HardwareDeSalaService(_context);

                        foreach (var item in sala.HardwaresSala)
                        {
                            if (_hardwareDeSalaService.GetByMAC(item.MAC, idUsuario) != null)
                            {
                                throw new ServiceException("Já existe um dispositivos com o endereço MAC " + item.MAC + " informado, corrija e tente novamente!");
                            }

                            if (item.TipoHardwareId.Id == TipoHardwareModel.CONTROLADOR_DE_SALA && _hardwareDeSalaService.GetByIp(item.Ip, idUsuario) != null)
                            {
                                throw new ServiceException("Já existe um dispositivos com o endereço IP  " + item.Ip + "  informado, corrija e tente novamente!");
                            }

                            _hardwareDeSalaService.Insert(new HardwareDeSalaModel {
                                MAC = item.MAC, SalaId = salaInserida.Id, TipoHardwareId = item.TipoHardwareId.Id, Ip = item.Ip
                            }, idUsuario);
                        }

                        transaction.Commit();
                        return(true);
                    }
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }

            return(true);
        }
        private bool EnviarComandosMonitoramento(MonitoramentoModel solicitacao)
        {
            var  _hardwareDeSalaService   = new HardwareDeSalaService(_context);
            var  modelDesatualizado       = GetById(solicitacao.Id);
            bool comandoEnviadoComSucesso = true;

            /*
             * Verifica qual o equipamento foi 'monitorado' para ligar/desligar
             */
            if (solicitacao.ArCondicionado != modelDesatualizado.ArCondicionado)
            {
                var _codigosInfravermelhoService = new CodigoInfravermelhoService(_context);
                var _equipamentoServiceService   = new EquipamentoService(_context);
                var idOperacao           = solicitacao.ArCondicionado ? OperacaoModel.OPERACAO_LIGAR : OperacaoModel.OPERACAO_DESLIGAR;
                var equipamento          = _equipamentoServiceService.GetByIdSalaAndTipoEquipamento(solicitacao.SalaId, EquipamentoModel.TIPO_CONDICIONADOR);
                var codigosInfravermelho = _codigosInfravermelhoService.GetByIdOperacaoAndIdEquipamento(equipamento.Id, idOperacao);
                var hardwareDeSala       = _hardwareDeSalaService.GetByIdSalaAndTipoHardware(solicitacao.SalaId, TipoHardwareModel.CONTROLADOR_DE_SALA).FirstOrDefault();

                if (codigosInfravermelho == null)
                {
                    throw new ServiceException("Houve um problema e o monitoramento não pode ser finalizado, por favor tente novamente mais tarde!");
                }

                var mensagem = "CONDICIONADOR;" + codigosInfravermelho.Codigo + ";";

                try
                {
                    var clienteSocket = new ClienteSocketService(hardwareDeSala.Ip);

                    clienteSocket.AbrirConexao();
                    var status = clienteSocket.EnviarComando(mensagem);
                    clienteSocket.FecharConexao();

                    solicitacao.ArCondicionado = status.Contains("AC-ON");
                    comandoEnviadoComSucesso   = status != null;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    return(false);
                }
            }
            else if (solicitacao.Luzes != modelDesatualizado.Luzes)
            {
                var hardwareDeSala = _hardwareDeSalaService.GetByIdSalaAndTipoHardware(solicitacao.SalaId, TipoHardwareModel.CONTROLADOR_DE_SALA).FirstOrDefault();

                var mensagem = "LUZES;" + solicitacao.Luzes + ";";

                try
                {
                    var clienteSocket = new ClienteSocketService(hardwareDeSala.Ip);

                    clienteSocket.AbrirConexao();
                    var status = clienteSocket.EnviarComando(mensagem);
                    clienteSocket.FecharConexao();

                    solicitacao.Luzes        = status.Contains("L-ON");
                    comandoEnviadoComSucesso = status != null;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    return(false);
                }
            }

            return(comandoEnviadoComSucesso);
        }