public void Handle(string json)
        {
            Console.WriteLine("Reminder invoked...");

            var reminder = JsonConvert.DeserializeObject <dynamic>(json);

            if (reminder.category.ToString().ToLower() == "user_notifications")
            {
                var userIdStr   = reminder.content.value.user.id.ToString();
                var userURIPath = "/api/v1/user/" + userIdStr + "/";
                var key         = userURIPath;

                var LANG = storeAPI.GetLang(userURIPath);

                if (reminder.content.name == "exercise_started")
                {
                    key = userURIPath + "_exercise";
                    Console.WriteLine("[ReminderHandler] Exercise started");
                    Console.WriteLine("[ReminderHandler] userActiveExcercise map key: " + key);

                    userActiveExerciseMap[key] = reminder;
                    string exerciseType = reminder.content.value.exercise_type.ToString();

                    InformCaregivers(userURIPath, "exercise", "none", Loc.Get(LANG, Loc.MSG, Loc.EXERCISE_STARTED, Loc.CAREGVR), string.Format(Loc.Get(LANG, Loc.DES, Loc.EXERCISE_STARTED, Loc.CAREGVR), exerciseType));
                    return;
                }
                else if (reminder.content.name == "exercise_ended")
                {
                    key = userURIPath + "_exercise";
                    Console.WriteLine("[ReminderHandler] Exercise ended");
                    Console.WriteLine("[ReminderHandler] userActiveExcercise map key: " + key);

                    if (userActiveExerciseMap.ContainsKey(key) && reminder.content.value.session_uuid == userActiveExerciseMap[key].content.value.session_uuid)
                    {
                        Console.WriteLine("Exercise ended is in the active map");

                        float  score        = float.Parse(reminder.content.value.score.ToString());
                        string exerciseType = reminder.content.value.exercise_type.ToString();

                        InformCaregivers(userURIPath,
                                         "exercise",
                                         "none",
                                         Loc.Get(LANG, Loc.MSG, Loc.EXERCISE_ENDED, Loc.CAREGVR),
                                         string.Format(Loc.Get(LANG, Loc.DES, Loc.EXERCISE_ENDED, Loc.CAREGVR), exerciseType, score));



                        var desc = Loc.EXERCISE_ENDED_HIGH;

                        if (score <= 30)
                        {
                            desc = Loc.EXERCISE_ENDED_LOW;
                        }
                        else if (score > 30 && score <= 60)
                        {
                            desc = Loc.EXERCISE_ENDED_MID;
                        }


                        InformUser(userURIPath, "exercise", "low", Loc.Get(LANG, Loc.MSG, Loc.EXERCISE_ENDED_LOW, Loc.USR), Loc.Get(LANG, Loc.DES, desc, Loc.USR));
                        userActiveExerciseMap.Remove(key);
                    }
                    return;
                }

                //key = userURIPath + reminder.type;

                if (reminder.content.name == "reminder_sent")
                {
                    Console.WriteLine("[reminder_handler] reminder sent entered");
                    var journalId    = reminder.content.value.journal.id_enduser.ToString();
                    var journalEntry = storeAPI.GetJournalEntryById(journalId);

                    Console.WriteLine("[reminder_handler] Sent journal entry message for reminder: " + journalEntry.message.ToString());

                    Console.WriteLine("Type: " + journalEntry.type.ToString());

                    var msg = new List <string>(journalEntry.message.ToString().Split(' '));
                    var des = new List <string>(journalEntry.description.ToString().Split(' '));

                    msg.AddRange(des);

                    Console.WriteLine("Contains blood or presure " + (msg.Contains("blood") || msg.Contains("pressure")));
                    Console.WriteLine("Contains weight: " + msg.Contains("weight"));

                    // set the key
                    if (msg.Contains("blood") || msg.Contains("pressure"))
                    {
                        key = userURIPath + "_blood_pressure";
                    }
                    else if (msg.Contains("weight"))
                    {
                        key = userURIPath + "_weight";
                    }
                    Console.WriteLine("[ReminderHandler] userReminder map key: " + key);


                    if (userReminderMap.ContainsKey(key))
                    {
                        userReminderMap.Remove(key);
                    }

                    userReminderMap.Add(key, reminder);

                    var aTimer = new System.Timers.Timer(WAIT_MS);
                    aTimer.AutoReset = false;
                    aTimer.Start();
                    aTimer.Elapsed += (x, y) =>
                    {
                        if (userReminderMap.ContainsKey(key))
                        {
                            if (msg.Contains("blood") || msg.Contains("pressure"))
                            {
                                Console.WriteLine("Blood pressure measured wasn't ack");

                                InformCaregivers(userURIPath, "heart", "high",
                                                 "The person under your care ignored the blood pressure measurements reminder.",
                                                 "Please take action and call to remind them of the measurement.");

                                userReminderMap.Remove(key);
                            }
                            else if (msg.Contains("weight"))
                            {
                                InformCaregivers(userURIPath, "weight", "high",
                                                 "The person under your care ignored the weight measurements reminder.",
                                                 "Please take action and call to remind them of the measurement.");

                                userReminderMap.Remove(key);
                            }
                        }
                    };
                }
                else if (reminder.content.name == "reminder_acknowledged")
                {
                    var ack          = reminder.content.value.ack.ToString() == "ok" ? true : false;
                    var journalId    = reminder.content.value.journal.id.ToString();
                    var journalEntry = storeAPI.GetJournalEntryById(journalId);

                    Console.WriteLine(journalId);
                    storeAPI.PatchJournalEntry(journalId, ack);

                    var msg = new List <string>(journalEntry.message.ToString().Split(' '));
                    var des = new List <string>(journalEntry.description.ToString().Split(' '));

                    msg.AddRange(des);

                    Console.WriteLine("Contains blood or presure " + (msg.Contains("blood") || msg.Contains("pressure")));
                    Console.WriteLine("Contains weight: " + msg.Contains("weight"));

                    if (ack)
                    {
                        MetricsPublisher.Current.Increment("cami.event.reminder.ack", 1);

                        Console.WriteLine("Reminder acknowledged");

                        //Do this just in case it's possible to check if user did something for example
                        //there is a new value in weight measurements and ignore if it's not possible
                        //for example medication

                        Console.WriteLine("Type: " + journalEntry.type.ToString());
                        Console.WriteLine("[reminder_handler] Acknowledged journal entry message: " + journalEntry.message.ToString());

                        //var expectedMessage = Loc.Get(LANG, Loc.MSG, Loc.REMINDER_SENT, Loc.USR);

                        if (msg.Contains("blood") || msg.Contains("pressure"))
                        {
                            Console.WriteLine("ACK blood pressure measurement!");

                            // set key
                            key = userURIPath + "_blood_pressure";

                            var aTimer = new System.Timers.Timer(WAIT_MS);
                            aTimer.AutoReset = false;
                            aTimer.Start();
                            aTimer.Elapsed += (x, y) =>
                            {
                                Console.WriteLine("Blood pressure check invoked");

                                if (!storeAPI.CheckForMeasuremntInLastNMinutes("blood_pressure", 6, int.Parse(userIdStr)))
                                {
                                    Console.WriteLine("Blood pressure wasn't measured");

                                    InformCaregivers(userURIPath, "heart", "high",
                                                     Loc.Get(LANG, Loc.MSG, Loc.MEASUREMENT_IGNORED, Loc.CAREGVR),
                                                     Loc.Get(LANG, Loc.DES, Loc.MEASUREMENT_IGNORED, Loc.CAREGVR));
                                }
                            };
                        }
                        else if (msg.Contains("weight"))
                        {
                            Console.WriteLine("ACK Weight measurement!");

                            // set key
                            key = userURIPath + "_weight";

                            var aTimer = new System.Timers.Timer(WAIT_MS);
                            aTimer.AutoReset = false;
                            aTimer.Start();
                            aTimer.Elapsed += (x, y) =>
                            {
                                if (!storeAPI.CheckForMeasuremntInLastNMinutes("weight", 6, int.Parse(userIdStr)))
                                {
                                    Console.WriteLine("Weight wasn't measured");

                                    InformCaregivers(userURIPath, "weight", "high",
                                                     Loc.Get(LANG, Loc.MSG, Loc.MEASUREMENT_IGNORED_WEIGHT, Loc.CAREGVR),
                                                     Loc.Get(LANG, Loc.DES, Loc.MEASUREMENT_IGNORED_WEIGHT, Loc.CAREGVR));
                                }
                            };
                        }

                        Console.WriteLine("[ReminderHandler] userReminder map key: " + key);
                        userReminderMap.Remove(key);
                    }
                    else
                    {
                        Console.WriteLine("Reminder snoozed");

                        // send the BP snoozed notification only if it is relating to a BP reminder journal entry

                        if (msg.Contains("blood") || msg.Contains("pressure"))
                        {
                            // set key
                            key = userURIPath + "_blood_pressure";

                            Console.WriteLine("Snoozed blood pressure measurement!");
                            InformCaregivers(userURIPath, "heart", "medium", Loc.Get(LANG, Loc.MSG, Loc.MEASUREMENT_POSTPONED, Loc.CAREGVR), Loc.Get(LANG, Loc.DES, Loc.MEASUREMENT_POSTPONED, Loc.CAREGVR));
                        }
                        else if (msg.Contains("weight"))
                        {
                            // set key
                            key = userURIPath + "_weight";

                            Console.WriteLine("Snoozed weight measurement!");
                            InformCaregivers(userURIPath, "weight", "medium", Loc.Get(LANG, Loc.MSG, Loc.MEASUREMENT_POSTPONED_WEIGHT, Loc.CAREGVR),
                                             Loc.Get(LANG, Loc.DES, Loc.MEASUREMENT_POSTPONED_WEIGHT, Loc.CAREGVR));
                        }

                        Console.WriteLine("[ReminderHandler] userReminder map key: " + key);
                        userReminderMap.Remove(key);
                    }
                }
            }
        }