/// <summary>
        /// Creates an Amazon RespondDecisionTaskCompletedRequest to notify SWF that decison was made based on decision
        /// </summary>
        /// <param name="decider"></param>
        /// <returns></returns>
        internal RespondDecisionTaskCompletedRequest MakeDecision(IDecider decider, WorkflowDecisionContext decisionContext)
        {
            if (decider == null)
            {
                var attributes = new FailWorkflowExecutionDecisionAttributes
                {
                    Details = "WorkflowId: " + decisionContext.WorkflowId,
                    Reason  = "Decider not found."
                };

                var decisionRequest = new RespondDecisionTaskCompletedRequest
                {
                    Decisions = new List <Decision>
                    {
                        new Decision
                        {
                            DecisionType = DecisionType.FailWorkflowExecution,
                            FailWorkflowExecutionDecisionAttributes = attributes
                        }
                    }
                };
                return(decisionRequest);
            }

            RespondDecisionTaskCompletedRequest decisionCompletedRequest;

            // Match the context and call the right method to make a decision
            if (decisionContext.DecisionType == EventType.WorkflowExecutionStarted)
            {
                decisionCompletedRequest = decider.OnWorkflowExecutionStarted(decisionContext);
            }
            else if (decisionContext.DecisionType == DecisionType.ContinueAsNewWorkflowExecution)
            {
                decisionCompletedRequest = decider.OnWorkflowExecutionContinuedAsNew(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.WorkflowExecutionCancelRequested)
            {
                decisionCompletedRequest = decider.OnWorkflowExecutionCancelRequested(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ActivityTaskCompleted)
            {
                decisionCompletedRequest = decider.OnActivityTaskCompleted(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ActivityTaskFailed)
            {
                decisionCompletedRequest = decider.OnActivityTaskFailed(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ActivityTaskTimedOut)
            {
                decisionCompletedRequest = decider.OnActivityTaskTimedOut(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ScheduleActivityTaskFailed)
            {
                decisionCompletedRequest = decider.OnScheduleActivityTaskFailed(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ChildWorkflowExecutionStarted)
            {
                decisionCompletedRequest = decider.OnChildWorkflowExecutionStarted(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ChildWorkflowExecutionCompleted)
            {
                decisionCompletedRequest = decider.OnChildWorkflowExecutionCompleted(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ChildWorkflowExecutionFailed)
            {
                decisionCompletedRequest = decider.OnChildWorkflowExecutionFailed(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ChildWorkflowExecutionTerminated)
            {
                decisionCompletedRequest = decider.OnChildWorkflowExecutionTerminated(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.ChildWorkflowExecutionTimedOut)
            {
                decisionCompletedRequest = decider.OnChildWorkflowExecutionTimedOut(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.StartChildWorkflowExecutionFailed)
            {
                decisionCompletedRequest = decider.OnStartChildWorkflowExecutionFailed(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.TimerStarted)
            {
                decisionCompletedRequest = decider.OnTimerStarted(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.TimerFired)
            {
                decisionCompletedRequest = decider.OnTimerFired(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.TimerCanceled)
            {
                decisionCompletedRequest = decider.OnTimerCanceled(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.StartChildWorkflowExecutionInitiated)
            {
                decisionCompletedRequest = decider.OnStartChildWorkflowExecutionInitiated(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.WorkflowExecutionSignaled)
            {
                decisionCompletedRequest = decider.OnWorkflowExecutionSignaled(decisionContext);
            }
            else if (decisionContext.DecisionType == EventType.WorkflowExecutionCompleted)
            {
                decisionCompletedRequest = decider.OnWorkflowExecutionCompleted(decisionContext);
            }
            else
            {
                throw new InvalidOperationException("Unhandled event type.");
            }
            return(decisionCompletedRequest);
        }