public static async Task <SkillResponse> FunctionHandlerAsync(SkillRequest input, ILambdaContext context)
        {
            try
            {
                if (input.Context.System.User.Permissions == null)
                {
                    return(ResponseBuilder.TellWithAskForPermissionConsentCard("To set reminders, you need to allow Trello Grocery to create and edit reminders for this skill. Would you like to do that?",
                                                                               new[] { "alexa::alerts:reminders:skill:readwrite" }, input.Session
                                                                               ));
                }
                else
                {
                    // Has permissions, ask if user wants to create a reminder?

                    var sess = input.Session;

                    if (!await RemindersExtensions.AnyActiveRemindersAsync(input) &&
                        sess.Attributes == null)
                    {
                        sess.Attributes = new Dictionary <string, object>();
                        sess.Attributes["reminderRequest"] = true;

                        return(SkillResponseExtensions.GetPermissionsRequestResponse(sess));
                    }
                }

                if (input.IsIntentRequest())
                {
                    var intentRequest = input.Request as IntentRequest;

                    if (intentRequest.IsAddGroceries())
                    {
                        var item = intentRequest.Intent.Slots["GroceryItem"].SlotValue;

                        if (item.SlotType == SlotValueType.List)
                        {
                            foreach (var v in item.Values)
                            {
                                await _trelloApiClient.Cards.CreateCardAsync(new Trello.Responses.Card {
                                    ListId = ToBuyListId, Name = v.Value.CapitalizeFirstLetterOfEachWord()
                                });
                            }

                            return(ResponseBuilder.Tell($"I've added {item.Values.Count()} items to your grocery board."));
                        }

                        await _trelloApiClient.Cards.CreateCardAsync(new Trello.Responses.Card {
                            ListId = ToBuyListId, Name = item.Value.CapitalizeFirstLetterOfEachWord()
                        });

                        return(ResponseBuilder.Tell($"I've added {item} to your grocery board"));
                    }
                    else if (intentRequest.IsGetGroceries())
                    {
                        var cardsOnGroceryList = await _trelloApiClient.Lists.GetCards(ToBuyListId);

                        return(ResponseBuilder.Tell(SkillResponseSentences.GetGroceryItems(cardsOnGroceryList)));
                    }
                    else if (intentRequest.IsFinishedShopping())
                    {
                        // Archive all cards on the Already Have list
                        // TODO: Figure out how to archive list without hardcoding listId
                        await _trelloApiClient.Lists.ArchiveAllCards(BoughtListId);

                        return(SkillResponseExtensions.GetFinishedShoppingIntentResponse());
                    }
                    else if (intentRequest.Yes())
                    {
                        if (input.Session.Attributes == null)
                        {
                            throw new Exception("No attributes specified for YES intent");
                        }

                        if (input.Session.Attributes["reminderRequest"].Equals(true))
                        {
                            await RemindersExtensions.SetAWeeklyReminder(input);

                            return(SkillResponseExtensions.GetReminderCreatedResponse());
                        }
                    }
                }
                else if (input.IsLaunchRequest())
                {
                    return(SkillResponseExtensions.GetLaunchResponse());
                }
                else if (input.IsSessionEndedRequest())
                {
                    return(SkillResponseExtensions.GetSessionEndedResponse());
                }
            }
            catch (Exception ex)
            {
                context.Logger.Log(ex.Message);
            }

            return(ResponseBuilder.Tell("Skill default response"));
        }