public HttpResponseMessage ApagarTarefa(TarefaDto tarefa)
 {
     try
     {
         tarefaAplicacaoServico.ApagarTarefa(tarefa);
         return Request.CreateResponse(HttpStatusCode.OK, "Tarefa excluída com sucesso!");
     }
     catch (Exception ex)
     {
         return Request.CreateResponse(HttpStatusCode.Forbidden, ex.Message);
     }
 }
 public void ApagarTarefa(TarefaDto tarefa)
 {
     if (tarefa != null || !tarefa.Id.HasValue)
     {
         //Tarefa tarefaDom = Montador.Montador.Monta(tarefa);
         dominio.ApagarTarefa(mapper.Map<Tarefa>(tarefa));
         dominio.CommitAlteracoes();
     }
     else
     {
         throw new ArgumentNullException("Tarefa vazia. Não podemos excluir objetos vazios.");
     }
 }
        public HttpResponseMessage AlterarTarefa(TarefaDto tarefa)
        {
            try
            {
                tarefaAplicacaoServico.AlterarTarefa(tarefa);

                return Request.CreateResponse(HttpStatusCode.OK, tarefa);
            }
            catch (Exception ex)
            {
                return Request.CreateResponse(HttpStatusCode.Forbidden, ex.Message);
            }
        }
        public void CadastrarTarefa(TarefaDto tarefa)
        {
            //Pega o Dto e converte para entidade

            if (tarefa != null)
            {
                //Tarefa tarefaDom = Montador.Montador.Monta(tarefa);
                dominio.CadastrarTarefa(mapper.Map<Tarefa>(tarefa));
                dominio.CommitAlteracoes();
            }
            else
            {
                throw new ArgumentNullException("Tarefa vazia. Não podemos cadastrar objetos vazios.");
            }
        }
        public TarefaDto BuscarTarefa(TarefaDto tarefa)
        {
            Tarefa tarefaDom = new Tarefa();

            //tarefaDom = mapper.Map<Tarefa>(tarefa);
            tarefaDom = dominio.BuscarTarefa(mapper.Map<Tarefa>(tarefa));

            if (tarefaDom.Id.HasValue)
            {
                return mapper.Map<TarefaDto>(tarefaDom);
            }
            else
            {
                return null;
            }
        }
        public void CadastrarNovaTarefa()
        {
            Nullable<long> idUsuario = 9;

            TarefaDto dto = new TarefaDto()
            {
                DataDaEntrega = DateTime.Now.AddDays(20),
                Descricao = "Teste de Inserção de Tarefa",
                Estado = EstadoTarefa.EmAberto,
                IdUsuario = idUsuario.Value,
                Nome = "Teste de Tarefa"
            };

            this.tarefaAplicacaoServico.CadastrarTarefa(dto);

            Assert.IsTrue(dto.Id.HasValue);
        }
        public static TarefaCadastroModel Monta(TarefaDto dto)
        {
            if (dto != null)
            {
                TarefaCadastroModel model = new TarefaCadastroModel()
                {
                    DataDaEntrega = dto.DataDaEntrega,
                    Descricao = dto.Descricao,
                    Estado = (EstadoTarefaModel)dto.Estado,
                    IdUsuario = dto.Usuario.Id,
                    Nome = dto.Nome
                };

                return model;
            }
            else
            {
                return null;
            }
        }
        public static TarefaDto Monta(Tarefa entidade)
        {
            if (entidade != null)
            {
                TarefaDto dto = new TarefaDto()
                {
                    DataDaEntrega = entidade.DataDaEntrega,
                    Descricao = entidade.Descricao,
                    Estado = (Aplicacao.Dto.EstadoTarefa) entidade.Estado,
                    Id = entidade.Id,
                    Nome = entidade.Nome
                };

                return dto;
            }
            else
            {
                return null;
            }
        }
        public static Tarefa Monta(TarefaDto dto)
        {
            if (dto != null)
            {
                Tarefa entidade = new Tarefa()
                {
                    DataDaEntrega = dto.DataDaEntrega.HasValue ? dto.DataDaEntrega.Value : dto.DataDaEntrega = null,
                    Descricao = dto.Descricao,
                    Estado = (Dominio.Entidade.EstadoTarefa)dto.Estado,
                    Id = dto.Id,
                    IdUsuario = dto.Usuario.Id,
                    Nome = dto.Nome
                };

                return entidade;
            }
            else
            {
                return null;
            }
        }
        public ICollection<TarefaDto> ListarTarefasNaoConcluidas(TarefaDto tarefa)
        {
            //Tarefa tarefaDom = Montador.Montador.Monta(tarefa);

            ICollection<Tarefa> tarefas = dominio.ListarTarefasNaoConcluidas(mapper.Map<Tarefa>(tarefa));

            if (tarefas != null && tarefas.Count > 0)
            {

                return mapper.Map<ICollection<Tarefa>, ICollection<TarefaDto>>(tarefas);

            }
            else
            {
                return null;
            }
        }
        public ICollection<TarefaDto> ListarTarefasConcluidasForaDoPrazo(TarefaDto tarefa)
        {
            ICollection<Tarefa> tarefas = dominio.ListarTarefasConcluidasForaDoPrazo(mapper.Map<Tarefa>(tarefa));

            if (tarefas != null && tarefas.Count > 0)
            {
                return mapper.Map<ICollection<Tarefa>, ICollection<TarefaDto>>(tarefas);
            }
            else
            {
                return null;
            }
        }
        public ICollection<TarefaDto> ListarTarefasAVencer(TarefaDto tarefa)
        {
            ICollection<Tarefa> tarefas = dominio.ListarTarefasAVencer(mapper.Map<Tarefa>(tarefa));

            if (tarefas != null && tarefas.Count > 0)
            {
                return mapper.Map<ICollection<Tarefa>, ICollection<TarefaDto>>(tarefas);
            }
            else
            {
                return null;
            }
        }
        public ICollection<TarefaDto> ListarTarefasAtrasadas(TarefaDto tarefa)
        {
            //Tarefa tarefaDom = Montador.Montador.Monta(tarefa);

            ICollection<Tarefa> tarefas = dominio.ListarTarefasAtrasadas(mapper.Map<Tarefa>(tarefa));

            if (tarefas != null && tarefas.Count > 0)
            {
                //ICollection<TarefaDto> dtos = Montador.Montador.Monta(tarefas);
                //return dtos;
                return mapper.Map<ICollection<Tarefa>, ICollection<TarefaDto>>(tarefas);
            }
            else
            {
                return null;
            }
        }
 public void MarcarTarefaComoConcluida(TarefaDto tarefa)
 {
     if (tarefa != null || !tarefa.Id.HasValue)
     {
         //Tarefa tarefaDom = Montador.Montador.Monta(tarefa);
         dominio.MarcarTarefaComoConcluida(mapper.Map<Tarefa>(tarefa));
         dominio.CommitAlteracoes();
     }
     else
     {
         throw new ArgumentNullException("Tarefa vazia. Não podemos marcar tarefas que não existem.");
     }
 }
        public void TarefaCadastroModelParaTarefaDto()
        {
            TarefaDto dto = new TarefaDto();
            TarefaCadastroModel model = new TarefaCadastroModel()
            {
                DataDaEntrega = DateTime.Now,
                Descricao = "Transcrição de Model para Dto",
                Estado = EstadoTarefaModel.EmAberto,
                IdUsuario = 1,
                Nome = "Transcrição de Model para Dto"
            };

            dto = mapper.Map<TarefaDto>(model);

            Assert.IsTrue(!String.IsNullOrEmpty(dto.Nome) && dto.Usuario.Id.HasValue);
        }
        public void ListaTarefasAVencer()
        {
            //Usuário de teste
            int idUsuario = 9;

            ICollection<TarefaDto> dtos = new List<TarefaDto>();
            TarefaDto dto = new TarefaDto() { Usuario = new UsuarioDto() { Id = idUsuario } };

            dtos = tarefaAplicacaoServico.ListarTarefasAVencer(dto);

            Assert.IsTrue(dtos.Count > 0);
        }
        public static TarefaDto Monta(TarefaCadastroModel model)
        {
            if (model != null)
            {
                TarefaDto dto = new TarefaDto()
                {
                    DataDaEntrega = model.DataDaEntrega,
                    Descricao = model.Descricao,
                    Estado = (EstadoTarefa)model.Estado,
                    Nome = model.Nome
                };

                return dto;
            }
            else
            {
                return null;
            }
        }
        public ICollection<TarefaDto> ListarTarefasPorData(DateTime dataInicio, DateTime dataTermino, TarefaDto tarefa)
        {
            ICollection<Tarefa> tarefas = dominio.ListarTarefasPorData(dataInicio, dataTermino, mapper.Map<Tarefa>(tarefa));

            if (tarefas != null && tarefas.Count > 0)
            {
                return mapper.Map<ICollection<Tarefa>, ICollection<TarefaDto>>(tarefas);
            }
            else
            {
                return null;
            }
        }
        public HttpResponseMessage ListaTarefas(string idUsuario, string tipoBusca, String dataInicio = null, String dataTermino = null)
        {
            try
            {
                ICollection<TarefaDto> tarefas = new List<TarefaDto>();

                TarefaDto dto = new TarefaDto()
                {
                    IdUsuario = long.Parse(idUsuario)
                };

                switch (int.Parse(tipoBusca))
                {
                    case 0:
                        tarefas = tarefaAplicacaoServico.ListarTodasAsTarefasDoUsuario(dto);

                        if (tarefas != null && tarefas.Count > 0)
                        {
                            return Request.CreateResponse(HttpStatusCode.OK, tarefas.ToList());
                        }
                        else
                        {
                            return Request.CreateResponse(HttpStatusCode.OK);
                        }
                    case 1:
                        tarefas = tarefaAplicacaoServico.ListarTarefasAVencer(dto);

                        if (tarefas != null && tarefas.Count > 0)
                        {
                            return Request.CreateResponse(HttpStatusCode.OK, tarefas.ToList());
                        }
                        else
                        {
                            return Request.CreateResponse(HttpStatusCode.OK);
                        }
                    case 2:
                        tarefas = tarefaAplicacaoServico.ListarTarefasConcluidas(dto);

                        if (tarefas != null && tarefas.Count > 0)
                        {
                            return Request.CreateResponse(HttpStatusCode.OK, tarefas.ToList());
                        }
                        else
                        {
                            return Request.CreateResponse(HttpStatusCode.OK);
                        }
                    case 3:

                        tarefas = tarefaAplicacaoServico.ListarTarefasAtrasadas(dto);

                        if (tarefas != null && tarefas.Count > 0)
                        {
                            return Request.CreateResponse(HttpStatusCode.OK, tarefas.ToList());
                        }
                        else
                        {
                            return Request.CreateResponse(HttpStatusCode.OK);
                        }
                    default:
                        return Request.CreateResponse(HttpStatusCode.OK);
                }
            }
            catch(Exception ex)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
            }
        }
        public ICollection<TarefaDto> ListarTodasAsTarefasDoUsuario(TarefaDto tarefa)
        {
            //Tarefa tarefaDom = Montador.Montador.Monta(tarefa);

            ICollection<Tarefa> tarefas = dominio.ListarTodasAsTarefasDoUsuario(mapper.Map<Tarefa>(tarefa));

            if (tarefas != null && tarefas.Count > 0)
            {
                /*ICollection<TarefaDto> dtos = Montador.Montador.Monta(tarefas);

                return dtos;*/
                return mapper.Map<ICollection<Tarefa>, ICollection<TarefaDto>>(tarefas);
            }
            else
            {
                return null;
            }
        }
        public ICollection<TarefaListarModel> TodasAsTarefas(Nullable<long> idUsuario)
        {
            TarefaDto dto;

            ICollection<TarefaDto> listaTodasAsTarefasDto = new List<TarefaDto>();
            ICollection<TarefaListarModel> listaTodasAsTarefas = new List<TarefaListarModel>();

            dto = new TarefaDto
            {
                IdUsuario = idUsuario
            };

            listaTodasAsTarefasDto = tarefaAplicacaoServico.ListarTodasAsTarefasDoUsuario(dto);

            if (listaTodasAsTarefasDto != null && listaTodasAsTarefasDto.Count > 0)
            {
                return Mapeador.Map<ICollection<TarefaDto>,ICollection<TarefaListarModel>>(listaTodasAsTarefasDto);
            }
            else
            {
                return null;
            }
        }
        public ActionResult Executar(Nullable<long> idTarefa)
        {
            TarefaDto dto;
            PainelDeTarefaModel painel = new PainelDeTarefaModel();
            string idUsuarioSession;

            if (idTarefa.HasValue)
            {
                dto = new TarefaDto();
                idUsuarioSession = Session["idUsuario"].ToString();

                dto = tarefaAplicacaoServico.BuscarTarefa(new TarefaDto() { Id = idTarefa.Value});

                if(dto != null)
                {
                    if (dto.Id.HasValue)
                    {
                        this.tarefaAplicacaoServico.MarcarTarefaComoConcluida(dto);
                    }
                }

                painel = this.MontaPainelDeTarefas(int.Parse(idUsuarioSession));

                if (painel != null)
                {
                    return View("Painel",painel);
                }
                else
                {
                    return null;
                }
            }
            else
            {
                return null;
            }
        }
        public JsonResult CadastrarTarefa(TarefaCadastroModel model)
        {
            try
            {
                PainelDeTarefaModel painelDeTarefasModel;
                ModelState.Clear();
                TarefaDto dto = new TarefaDto();
                model.IdUsuario = int.Parse(Session["IdUsuario"].ToString());

                dto = Mapeador.Map<TarefaDto>(model);

                if (dto != null)
                {
                    this.tarefaAplicacaoServico.CadastrarTarefa(dto);

                    painelDeTarefasModel = this.MontaPainelDeTarefas(dto.IdUsuario.Value);

                    return Json("Tarefa " + model.Nome + " cadastrada com sucesso!");
                }
                else
                {
                    return null;
                }
            }
            catch (DbEntityValidationException e)
            {
                String erro = String.Empty;
                foreach (var eve in e.EntityValidationErrors)
                {
                     erro += String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (var ve in eve.ValidationErrors)
                    {
                        erro += String.Format("- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage);
                    }
                }
                return Json(erro.ToString());
            }
            catch(Exception ex)
            {
                return Json(ex.Message);
            }
        }
        public void TarefaDtoParaTarefa()
        {
            Tarefa tarefa = new Tarefa();

            TarefaDto dto = new TarefaDto()
            {
                DataDaEntrega = DateTime.Now,
                Descricao = "Transcrever o dto de Tarefas para a entidade",
                Estado = global::Aplicacao.Dto.EstadoTarefa.EmAberto,
                Nome = "Transcrever o dto de tarefas -> entidade",
                Usuario = new UsuarioDto()
                {
                    Id = 9
                }
            };

            tarefa = mapper.Map<Tarefa>(dto);

            Assert.IsTrue(!String.IsNullOrEmpty(dto.Nome) && dto.Usuario.Id.HasValue);
        }
        public static ICollection<TarefaDto> Monta(ICollection<TarefaListarModel> models)
        {
            if (models != null && models.Count > 0 )
            {
                ICollection<TarefaDto> dtos = new List<TarefaDto>();

                foreach(TarefaListarModel linha in models)
                {
                    TarefaDto dto = new TarefaDto()
                    {
                        DataDaEntrega = linha.DataDaEntrega,
                        Descricao = linha.Descricao,
                        Estado = (EstadoTarefa)linha.Estado,
                        Id = linha.Id,
                        Nome = linha.Nome,
                        Usuario = new UsuarioDto()
                        {
                            Id = linha.IdUsuario
                        }
                    };
                    dtos.Add(dto);
                }

                return dtos;
            }
            else
            {
                return null;
            }
        }
        public HttpResponseMessage MarcarTarefaComoConcluida(TarefaDto tarefa)
        {
            try
            {
                tarefaAplicacaoServico.MarcarTarefaComoConcluida(tarefa);
                return Request.CreateResponse(HttpStatusCode.OK, "Tarefa executada!");
            }
            catch (Exception ex)
            {

                return Request.CreateResponse(HttpStatusCode.Forbidden, ex.Message);
            }
        }
        public void TarefaDtoParaTarefaCadastroModel()
        {
            TarefaCadastroModel model = new TarefaCadastroModel();
            TarefaDto dto = new TarefaDto()
            {
                DataDaEntrega = DateTime.Now,
                Descricao = "Transcrição de Model para Dto",
                Estado = global::Aplicacao.Dto.EstadoTarefa.EmAberto,
                Nome = "Transcrição de Model para Dto",
                Usuario = new UsuarioDto()
                {
                    Id = 9
                }
            };

            model = mapper.Map<TarefaCadastroModel>(dto);

            Assert.IsTrue(!String.IsNullOrEmpty(model.Nome) && model.IdUsuario.HasValue);
        }
        public void TarefaParaTarefaDto()
        {
            TarefaDto dto = new TarefaDto();

            Tarefa tarefa = new Tarefa()
            {
                DataDaEntrega = DateTime.Now,
                Descricao = "Teste de transcrição da Entidade Tarefa para o Dto de Tarefa",
                Estado = Dominio.Entidade.EstadoTarefa.EmAberto,
                Nome = "Testa a Transcrição da entidade Tarefa",
                Usuario = new Usuario()
                {
                    Id = 9
                }
            };

            dto = mapper.Map<TarefaDto>(tarefa);

            Assert.IsTrue(!String.IsNullOrEmpty(dto.Nome) && dto.Usuario.Id.HasValue);
        }
        public ActionResult TodasAsTarefas(Nullable<long> idUsuario)
        {
            try
            {
                TarefaDto dto = new TarefaDto()
                {
                    Usuario = new UsuarioDto()
                    {
                        Id = idUsuario
                    }
                };

                ICollection<TarefaDto> dtos = tarefaAplicacaoServico.ListarTodasAsTarefasDoUsuario(dto);

                if (dtos != null && dtos.Count > 0)
                {
                    ICollection<TarefaListarModel> models = Montador.MontaModeloDominioEViceVersa.Monta(dtos);

                    return Json(new { TarefaModel = dtos },"application/json",Encoding.UTF8);
                }
                else
                {
                    return null;
                }
            }
            catch (ExcecaoTarefa et)
            {
                return Json(new { ExcecaoTarefa = String.Format("Erro: {0}", et.Message) }, "application/json", Encoding.UTF8);
            }
            catch (Exception ex)
            {
                HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
                return Json(new { ExcecaoTarefa = String.Format("Erro: {0}", ex.Message) }, "application/json", Encoding.UTF8);
            }
        }