private void ModelErrors(Adoption adoption)
        {
            try
            {
                List <Adoption> userAdoptions = context.Adoption.Where(a =>
                                                                       a.UserId == adoption.UserId &&
                                                                       a.AdoptionStatusId == AdoptionStatus.RETURNED &&
                                                                       a.CreatedAt <= DateTime.Today.AddMonths(1)
                                                                       ).ToList();

                if (userAdoptions.Count > 0)
                {
                    ModelState.AddModelError("adoption.UserId", "Usuários que devolveram animais devem aguardar um mês antes de iniciar uma nova adoção.");
                }

                AdoptionQueue queue = context.AdoptionQueue.Find(adoption.AdoptionQueueId);
                if (queue == null)
                {
                    ModelState.AddModelError("adoption.AdoptionQueueId", "Fila de adoção não enontrada. É necessário estar numa fila para iniciar uma adoção.");
                }

                if (!queue.IsActive)
                {
                    ModelState.AddModelError("adoption.AdoptionQueueId", "Essa fila de adoção foi cancelada.");
                }

                if (queue.AnimalId != adoption.AnimalId || queue.UserId != adoption.UserId)
                {
                    ModelState.AddModelError("adoption.AdoptionQueueId", "Fila inválida: Animal ou adotante não podem ser diferentes da fila.");
                }

                Adoption queueAdoption = context.Adoption.FirstOrDefault(a => a.AdoptionQueueId == queue.Id);
                if (queueAdoption != null)
                {
                    ModelState.AddModelError("adoption.AdoptionQueueId", "Fila inválida: Essa fila já gerou uma adoção.");
                }

                IList <Adoption> animalAdoptions = context.Adoption.Where(a => a.AnimalId == adoption.AnimalId).ToList();
                if (animalAdoptions.Any(a => a.AdoptionStatusId == AdoptionStatus.FINISHED || a.AdoptionStatusId == AdoptionStatus.WAITING))
                {
                    ModelState.AddModelError("adoption.AnimalId", "Esse animal já foi adotado ou está em processo de adoção.");
                }

                if (adoption.CreatedAt == null)
                {
                    ModelState.AddModelError("adoption.CreatedAt", "Data da criação obrigatória.");
                }
            }
            catch (Exception e)
            {
                ModelState.AddModelError("Message", e.Message);
            }
        }
        public IHttpActionResult Get(int Id, string type = "Id")
        {
            try
            {
                if (type == TYPE_BY_ID)
                {
                    AdoptionQueue adoptionQueue = context.AdoptionQueue
                                                  .Include(a => a.Animal)
                                                  .Include(a => a.User)
                                                  .FirstOrDefault(a => a.Id == Id)
                    ;

                    if (adoptionQueue == null)
                    {
                        return(NotFound());
                    }

                    return(Ok(adoptionQueue));
                }
                else if (type == TYPE_BY_ADOPTER)
                {
                    IList <AdoptionQueue> list = context.AdoptionQueue
                                                 .Include(a => a.Animal)
                                                 .Include(a => a.User)
                                                 .Where(a => a.UserId == Id)
                                                 .ToList()
                    ;

                    return(Ok(list));
                }
                else if (type == TYPE_BY_ANIMAL)
                {
                    IList <AdoptionQueue> list = context.AdoptionQueue
                                                 .Include(a => a.Animal)
                                                 .Include(a => a.User)
                                                 .Where(a => a.AnimalId == Id)
                                                 .ToList()
                    ;

                    return(Ok(list));
                }
                else
                {
                    return(BadRequest("Tipo inválido"));
                }
            }
            catch (Exception)
            {
                return(BadRequest());
            }
        }
        private void ModelErrors(AdoptionQueue adoptionQueue)
        {
            try
            {
                List <Adoption> userAdoptions = context.Adoption.Where(a =>
                                                                       a.UserId == adoptionQueue.UserId &&
                                                                       a.AdoptionStatusId == AdoptionStatus.RETURNED &&
                                                                       a.CreatedAt <= DateTime.Today.AddMonths(1)
                                                                       ).ToList();

                if (userAdoptions.Count > 0)
                {
                    ModelState.AddModelError("adoptionQueue.UserId", "Usuários que devolveram animais devem aguardar um mês antes de iniciar uma nova adoção.");
                }

                IList <Adoption> adoptions = context.Adoption.Where(a => a.AnimalId == adoptionQueue.AnimalId).ToList();
                if (adoptions != null)
                {
                    if (adoptions.Any(adoption => adoption.AdoptionStatusId == AdoptionStatus.FINISHED))
                    {
                        ModelState.AddModelError("adoptionQueue.AnimalId", "Esse animal já foi adotado.");
                    }

                    if (adoptions.Any(adoption => adoption.AdoptionStatusId == AdoptionStatus.WAITING))
                    {
                        ModelState.AddModelError("adoptionQueue.AnimalId", "Esse animal já está em processo de adoção.");
                    }
                }

                AdoptionQueue queue = context.AdoptionQueue.FirstOrDefault(q =>
                                                                           q.IsActive == true &&
                                                                           q.UserId == adoptionQueue.UserId &&
                                                                           q.AnimalId == adoptionQueue.AnimalId
                                                                           );

                if (queue != null)
                {
                    ModelState.AddModelError("adoptionQueue.AnimalId", "Esse animal já esta na fila de adoção desse usuário.");
                }
            }
            catch (Exception e)
            {
                ModelState.AddModelError("Message", e.Message);
            }
        }
        public IHttpActionResult Put(int Id, [FromBody] AdoptionQueue adoptionQueue)
        {
            try
            {
                if (Id != adoptionQueue.Id)
                {
                    return(BadRequest("Os IDs de identificação não podem ser diferentes"));
                }

                AdoptionQueue adoptionQueueOld = context.AdoptionQueue.Find(Id);

                if (adoptionQueueOld == null)
                {
                    return(NotFound());
                }

                Adoption adoption = context.Adoption.FirstOrDefault(a => a.AdoptionQueueId == Id);
                if (
                    adoption != null &&
                    (adoption.AdoptionStatusId == AdoptionStatus.FINISHED || adoption.AdoptionStatusId == AdoptionStatus.WAITING)
                    )
                {
                    ModelState.AddModelError("adoptionQueue.AnimalId", "Esse animal já foi adotado ou está em processo de adoção e sua fila não pode mais se alterada.");
                }

                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                adoptionQueueOld.IsActive = adoptionQueue.IsActive;

                context.AdoptionQueue.Update(adoptionQueueOld);
                context.SaveChanges();
                return(Ok());
            }
            catch (Exception)
            {
                return(BadRequest());
            }
        }
        public IHttpActionResult Post([FromBody] AdoptionQueue adoptionQueue)
        {
            try
            {
                ModelErrors(adoptionQueue);

                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                context.AdoptionQueue.Add(adoptionQueue);
                context.SaveChanges();
                string location = Url.Link("DefaultApi", new { controller = "adoptionqueues", id = adoptionQueue.Id });
                return(Created(new Uri(location), adoptionQueue));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
        public IHttpActionResult Put(int Id, [FromBody] Adoption adoption)
        {
            try
            {
                if (Id != adoption.Id)
                {
                    return(BadRequest("Os IDs de identificação não podem ser diferentes"));
                }

                Adoption adoptionOld = context.Adoption.Find(Id);

                if (adoptionOld == null)
                {
                    return(NotFound());
                }

                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                if (adoption.AdoptionStatusId == AdoptionStatus.CANCELED || adoption.AdoptionStatusId == AdoptionStatus.RETURNED)
                {
                    AdoptionQueue queue = context.AdoptionQueue.Find(adoption.AdoptionQueueId);
                    queue.IsActive = false;
                    context.AdoptionQueue.Update(queue);
                }

                adoptionOld.AdoptionStatusId = adoption.AdoptionStatusId;

                context.Adoption.Update(adoptionOld);
                context.SaveChanges();
                return(Ok());
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }