private void CadastroFoto(UserAccount loggedUser)
        {
            var cadastroFoto = _context.UserMerits.FirstOrDefault(x => x.TargetUserId == loggedUser.Id && x.Merit.Name.Equals(MeritsConst.CadastrarFoto));
            if (cadastroFoto == null)
            {
                var hash = HashEmailForGravatar(User.Identity.Name);
                using (var client = new HttpClient())
                {
                    try
                    {
                        var response = client.GetByteArrayAsync("https://secure.gravatar.com/avatar/" + hash + "?d=404").Result;
                        var merit = _context.Merits.First(x => x.Name.Equals(MeritsConst.CadastrarFoto));

                        _context.UserMerits.Add(new UserMerit
                        {
                            MeritId = merit.Id,
                            Value = merit.Value,
                            TargetUserId = loggedUser.Id
                        });
                        _context.SaveChanges();
                    }
                    catch (Exception ex)
                    {

                    }
                }
            }
        }
        public ActionResult Index()
        {
            if (!_context.Users.Any(x => x.Mail.Equals(User.Identity.Name)))
            {
                var user = (ClaimsIdentity)User.Identity;
                var userAccount = new UserAccount() { Mail = user.Name, Name = user.Claims.First(x => x.Type == "name").Value.Replace("(Takenet)", "") };
                _context.Users.Add(userAccount);
                _context.SaveChanges();
            }

            var loggedUser = _context.Users.First(x => x.Mail == User.Identity.Name);

            PrimeiroAcesso(loggedUser);

            PrimeiroAcessoDia(loggedUser);

            CadastroFoto(loggedUser);

            var query = _context.UserMerits.Where(x => x.TargetUser.Mail == User.Identity.Name);
            ViewBag.Score = query.Sum(x => (decimal?)x.Value) ?? 0;
            ViewBag.MeritsCount = query.Count();

            ViewBag.Bronze = _context.UserMedals.Count(x => x.UserId == loggedUser.Id && x.Medal.Type == MedalType.Bronze);
            ViewBag.Silver = _context.UserMedals.Count(x => x.UserId == loggedUser.Id && x.Medal.Type == MedalType.Silver);
            ViewBag.Gold = _context.UserMedals.Count(x => x.UserId == loggedUser.Id && x.Medal.Type == MedalType.Gold);
            return View();
        }
        private void PrimeiroAcesso(UserAccount loggedUser)
        {
            var primeiroAcesso = _context.UserMerits.FirstOrDefault(x => x.TargetUserId == loggedUser.Id && x.Merit.Name.Equals(MeritsConst.PrimeiroAcesso));
            if (primeiroAcesso == null)
            {
                var merit = _context.Merits.First(x => x.Name.Equals(MeritsConst.PrimeiroAcesso));

                _context.UserMerits.Add(new UserMerit
                {
                    MeritId = merit.Id,
                    Value = merit.Value,
                    TargetUserId = loggedUser.Id
                });
                _context.SaveChanges();
            }
        }
        private void GiveMedal(UserAccount user)
        {
            var query = _context.UserMerits.Where(x => x.TargetUserId == user.Id);
            var targetUserScore = query.Sum(x => (decimal?)x.Value) ?? 0;

            var medals = _context.Medals.Where(x => x.Value <= targetUserScore).ToList();

            foreach (var medal in medals)
            {
                if (!_context.UserMedals.Any(x => x.UserId == user.Id && x.MedalId == medal.Id))
                {
                    var userMedal = new UserMedal
                    {
                        MedalId = medal.Id,
                        UserId = user.Id
                    };

                    _context.UserMedals.Add(userMedal);
                    _context.SaveChanges();
                }
            }
        }
        private void PrimeiroAcessoDia(UserAccount loggedUser)
        {
            var primeiroAcessoDia = _context.UserMerits.FirstOrDefault(x => x.TargetUserId == loggedUser.Id
                            && x.Merit.Name.Equals(MeritsConst.PrimeiroAcessoDia)
                            && x.Created.Day == DateTime.Now.Day
                            && x.Created.Month == DateTime.Now.Month
                            && x.Created.Year == DateTime.Now.Year);

            if (primeiroAcessoDia == null)
            {
                var merit = _context.Merits.First(x => x.Name.Equals(MeritsConst.PrimeiroAcessoDia));

                _context.UserMerits.Add(new UserMerit
                {
                    MeritId = merit.Id,
                    Value = merit.Value,
                    TargetUserId = loggedUser.Id
                });
                _context.SaveChanges();
            }
        }