public async Task <IActionResult> Compare(FacePattern model)
        {
            var tokenString = Request.Headers["Authorization"].ToString().Remove(0, 7);
            var handler     = new JwtSecurityTokenHandler();
            var jsonToken   = handler.ReadToken(tokenString);
            var token       = handler.ReadToken(tokenString) as JwtSecurityToken;
            var updaterId   = token.Claims.First(claim => claim.Type == "nameid").Value;
            var isPasswordChangeRequired = Convert.ToBoolean(token.Claims.First(claim => claim.Type == "password_change_required").Value);

            if (isPasswordChangeRequired)
            {
                return(Forbid());
            }

            var criminals = await _criminalService.CompareWithPattern(model);

            var criminalsModel = _mapper.Map <IList <CriminalModel> >(criminals);

            return(Ok(criminalsModel));
        }
        public async Task <IEnumerable <Criminal> > CompareWithPattern(FacePattern facePattern)
        {
            var asyncSession = _store.OpenAsyncSession("CriminalFinder.Criminals");
            var photos       = await asyncSession.Query <Photo>().ToListAsync();

            List <Criminal>        criminals         = new List <Criminal>();
            List <ComparisonModel> filteredCriminals = new List <ComparisonModel>();

            foreach (var photo in photos)
            {
                double a        = 0.0;
                double accuracy = 0.0;
                if (photo.PhotoOwner.Gender == facePattern.FaceAttributes.Gender)
                {
                    if (photo.FaceModel.FaceAttributes.Age <= facePattern.FaceAttributes.Age + 8 && photo.FaceModel.FaceAttributes.Age >= facePattern.FaceAttributes.Age - 8)
                    {
                        a++;
                    }
                    if (photo.PhotoOwner.Gender.Equals("male"))
                    {
                        if (photo.FaceModel.FaceAttributes.FacialHair.Moustache == 0.0 && facePattern.FaceAttributes.FacialHair.Moustache == 0.0)
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Beard == 0.0 && facePattern.FaceAttributes.FacialHair.Beard == 0.0)
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Sideburns == 0.0 && facePattern.FaceAttributes.FacialHair.Sideburns == 0.0)
                        {
                            a++;
                        }
                        if ((photo.FaceModel.FaceAttributes.FacialHair.Moustache < 0.5 && photo.FaceModel.FaceAttributes.FacialHair.Moustache > 0.0) &&
                            (facePattern.FaceAttributes.FacialHair.Moustache < 0.5 && facePattern.FaceAttributes.FacialHair.Moustache > 0.0))
                        {
                            a++;
                        }
                        if ((photo.FaceModel.FaceAttributes.FacialHair.Beard < 0.5 && photo.FaceModel.FaceAttributes.FacialHair.Beard > 0.0) &&
                            (facePattern.FaceAttributes.FacialHair.Beard < 0.5 && facePattern.FaceAttributes.FacialHair.Beard > 0.0))
                        {
                            a++;
                        }
                        if ((photo.FaceModel.FaceAttributes.FacialHair.Sideburns < 0.5 && photo.FaceModel.FaceAttributes.FacialHair.Sideburns > 0.0) &&
                            (facePattern.FaceAttributes.FacialHair.Sideburns < 0.5 && facePattern.FaceAttributes.FacialHair.Sideburns > 0.0))
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Moustache == 0.5 && facePattern.FaceAttributes.FacialHair.Moustache == 0.5)
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Beard == 0.5 && facePattern.FaceAttributes.FacialHair.Beard == 0.5)
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Sideburns == 0.5 && facePattern.FaceAttributes.FacialHair.Sideburns == 0.5)
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Moustache > 0.5 && facePattern.FaceAttributes.FacialHair.Moustache > 0.5)
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Beard > 0.5 && facePattern.FaceAttributes.FacialHair.Beard > 0.5)
                        {
                            a++;
                        }
                        if (photo.FaceModel.FaceAttributes.FacialHair.Sideburns > 0.5 && facePattern.FaceAttributes.FacialHair.Sideburns > 0.5)
                        {
                            a++;
                        }
                    }

                    if (photo.FaceModel.FaceAttributes.Glasses.Equals("NoGlasses") && facePattern.FaceAttributes.Glasses.Equals("NoGlasses"))
                    {
                        a++;
                    }
                    if (!photo.FaceModel.FaceAttributes.Glasses.Equals("NoGlasses") && !facePattern.FaceAttributes.Glasses.Equals("NoGlasses"))
                    {
                        a++;
                    }
                    if (photo.FaceModel.FaceAttributes.Hair.Bald < 0.5 && facePattern.FaceAttributes.Hair.Bald < 0.5)
                    {
                        a++;
                    }
                    if (photo.FaceModel.FaceAttributes.Hair.Bald == 0.5 && facePattern.FaceAttributes.Hair.Bald == 0.5)
                    {
                        a++;
                    }
                    if (photo.FaceModel.FaceAttributes.Hair.Bald > 0.5 && facePattern.FaceAttributes.Hair.Bald > 0.5)
                    {
                        a += 2.0;
                    }
                    else
                    {
                        List <HairColor> recognizedHairs = new List <HairColor>();
                        foreach (var hairColor in photo.FaceModel.FaceAttributes.Hair.HairColor)
                        {
                            if (hairColor.Confidence >= 0.9)
                            {
                                recognizedHairs.Add(hairColor);
                            }
                        }

                        List <HairColor> recognizedHairsSorted = recognizedHairs.OrderByDescending(h => h.Confidence).ToList();
                        string           recognizedHair        = string.Empty;

                        if (recognizedHairsSorted.Count > 0)
                        {
                            recognizedHair = recognizedHairsSorted[0].Color;
                        }

                        string recognizedHairFromPattern = facePattern.FaceAttributes.Hair.HairColor.Color;

                        if (recognizedHair.Equals(recognizedHairFromPattern))
                        {
                            a += 1.7;
                        }
                    }

                    if (photo.PhotoOwner.Gender.Equals("male"))
                    {
                        accuracy = a / 8;
                    }
                    else
                    {
                        accuracy = a / 5;
                    }

                    if (accuracy > 0.8)
                    {
                        filteredCriminals.Add(new ComparisonModel {
                            Criminal = photo.PhotoOwner, Accuracy = accuracy
                        });
                    }
                }
            }
            List <ComparisonModel> filteredCriminalsSorted = filteredCriminals.OrderByDescending(c => c.Accuracy).ToList();

            foreach (var item in filteredCriminalsSorted)
            {
                criminals.Add(item.Criminal);
            }
            return(criminals);
        }