public async Task <string> AccountPayment(string actorName, [FromBody] SimulateAssessmentModel Assessment)
        {
            var system = ActorSystemRefs
                         .ActorSystem
                         .ActorSelection($"akka://demo-system/user/demo-supervisor/{actorName}").ResolveOne(TimeSpan.FromSeconds(10));

            if (system.Exception != null)
            {
                return($"{actorName} is not running at the moment");
            }
            ImmutableList <InvoiceLineItem> items = ImmutableList.Create <InvoiceLineItem>(Assessment.LineItems.ToArray());

            var domanCommand = new BillingAssessment(actorName, items);
            var response     = await system.Result.Ask <ThisIsMyStatus>(domanCommand, TimeSpan.FromSeconds(10));

            return(response.Message);
        }
        public PortfolioModule() : base("/api/portfolio")
        {
            Get("/{portfolioName}", async args =>
            {
                TellMeYourPortfolioStatus answer = new TellMeYourPortfolioStatus("This didn't work");

                string portfolio = ((string)args.portfolioName).ToUpper();

                Task <IActorRef> portfolioActor = LoanerActors.DemoActorSystem
                                                  .ActorSelection($"/user/demoSupervisor/{portfolio}")
                                                  .ResolveOne(TimeSpan.FromSeconds(30));

                if (portfolioActor.Exception != null)
                {
                    throw portfolioActor.Exception;
                }

                await Task.Run(() =>
                {
                    answer = portfolioActor.Result
                             .Ask <TellMeYourPortfolioStatus>(new TellMeYourStatus(), TimeSpan.FromSeconds(150)).Result;
                    return(Response.AsJson(new { answer.Message, PortfolioState = answer.PortfolioStateViewModel }));
                });
                return(Response.AsJson(new { answer.Message, PortfolioState = answer.PortfolioStateViewModel }));
            });
            Get("/{portfolioName}/failedbilling", async args =>
            {
                FailedListOfAccounts answer;

                string portfolio = ((string)args.portfolioName).ToUpper();

                Task <IActorRef> portfolioActor = LoanerActors.DemoActorSystem
                                                  .ActorSelection($"/user/demoSupervisor/{portfolio}")
                                                  .ResolveOne(TimeSpan.FromSeconds(30));

                if (portfolioActor.Exception != null)
                {
                    throw portfolioActor.Exception;
                }

                await Task.Run(() =>
                {
                    answer = portfolioActor.Result
                             .Ask <FailedListOfAccounts>(new GetFailedBilledAccounts(), TimeSpan.FromSeconds(150)).Result;
                    return(Response.AsJson(answer));
                });
                return(Response.AsJson(new FailedListOfAccounts()));
            });

            Get("/{portfolioName}/run", async args =>
            {
                TellMeYourPortfolioStatus answer = new TellMeYourPortfolioStatus("This didn't work");

                string portfolio = ((string)args.portfolioName).ToUpper();

                Task <IActorRef> portfolioActor = LoanerActors.DemoActorSystem
                                                  .ActorSelection($"/user/demoSupervisor/{portfolio}")
                                                  .ResolveOne(TimeSpan.FromSeconds(3));

                if (portfolioActor.Exception != null)
                {
                    throw portfolioActor.Exception;
                }

                await Task.Run(() =>
                {
                    answer = portfolioActor.Result
                             .Ask <TellMeYourPortfolioStatus>(new StartAccounts(), TimeSpan.FromSeconds(30)).Result;
                    return(Response.AsJson(new { answer.Message, PortfolioState = answer.PortfolioStateViewModel }));
                });
                return(Response.AsJson(answer));
            });

            Get("/{portfolioName}/assessment", args =>
            {
                SimulateAssessmentModel model = new SimulateAssessmentModel();
                model.LineItems = new List <InvoiceLineItem>
                {
                    new InvoiceLineItem(new Tax(0)),
                    new InvoiceLineItem(new Dues(0)),
                    new InvoiceLineItem(new Reserve(0))
                };
                return(Response.AsJson(model));
            });


            Post("/{portfolioName}/assessment", async args =>
            {
                string portfolio = ((string)args.portfolioName).ToUpper();

                TellMeYourPortfolioStatus answer = new TellMeYourPortfolioStatus("This didn't work");

                dynamic product = Context.ToDynamic();

                string message = string.Empty;

                SimulateAssessmentModel assessment = new SimulateAssessmentModel();
                assessment.LineItems = new List <InvoiceLineItem>();

                foreach (dynamic p in product)
                {
                    string name         = (string)(p.item.name ?? string.Empty);
                    double bucketAmount = (double)(p.item.amount ?? -1.0);
                    if (bucketAmount >= 0)
                    {
                        switch (name)
                        {
                        case "Dues":
                            assessment.LineItems.Add(new InvoiceLineItem(new Dues(bucketAmount)));
                            break;

                        case "Tax":
                            assessment.LineItems.Add(new InvoiceLineItem(new Tax(bucketAmount)));
                            break;

                        case "Reserve":
                            assessment.LineItems.Add(new InvoiceLineItem(new Reserve(bucketAmount)));
                            break;

                        case "Interest":
                            assessment.LineItems.Add(new InvoiceLineItem(new Interest(bucketAmount)));
                            break;
                        }
                    }
                    else
                    {
                        return(Response.AsJson(new
                        {
                            Error = "You must provide a valid bucket type (i.e. Dues, Tax, etc.) and amount"
                        }));
                    }
                }

                IActorRef portfolioActor = await LoanerActors.DemoActorSystem
                                           .ActorSelection($"/user/demoSupervisor/{portfolio}")
                                           .ResolveOne(TimeSpan.FromSeconds(10));

                //if (portfolioActor.Exception != null) throw portfolioActor.Exception;

                await Task.Run(() =>
                {
                    answer = portfolioActor
                             .Ask <TellMeYourPortfolioStatus>(new AssessWholePortfolio(portfolio, assessment.LineItems),
                                                              TimeSpan.FromSeconds(50))
                             .Result;
                    return(Response.AsJson(new { answer.Message, PortfolioState = answer.PortfolioStateViewModel }));
                });
                return(Response.AsJson(answer));
            });
        }