public async Task <IActionResult> Execute(int id)
        {
            ViewData["Title"] = "Plano vykdymas";

            var programsResult = await _programService.GetAllPrograms();

            var programs = programsResult.result;
            var program  = programs.FirstOrDefault(x => x.Id == id);

            if (program == null)
            {
                return(RedirectToAction("Index"));
            }

            var model = new ExecuteProgramViewModel()
            {
                ProgramId       = program.Id,
                ProgramName     = program.Name,
                Nodes           = new List <Common.Models.Node>(program.Nodes),
                NodeInputValues = program.Inputs.Select(x => new ProgramInputWithValue(x)).ToList()
            };

            return(View(model));
        }
        public async Task <IActionResult> Execute(ExecuteProgramViewModel model)
        {
            ViewData["Title"] = "Plano vykdymas";

            var programsResult = await _programService.GetAllPrograms();

            var programs = programsResult.result;
            var program  = programs.FirstOrDefault(x => x.Id == model.ProgramId);

            if (program == null)
            {
                return(RedirectToAction("Index"));
            }

            var nodes = program.Nodes;

            if (nodes == null || !nodes.Any())
            {
                return(RedirectToAction("Index"));
            }

            model.Nodes = program.Nodes;

            var validationResult = ProgramHelpers.ValidateInputValues(model.NodeInputValues);

            if (!validationResult.isSuccessful)
            {
                ModelState.AddModelError("", validationResult.ToStringErrors());
                return(View(model));
            }

            var validationRes = validationResult.result;

            if (!validationRes)
            {
                ModelState.AddModelError("", "Netinkamos reikšmės.");
                return(View(model));
            }

            var count  = nodes.Count;
            var i      = 0;
            var result = "";

            do
            {
                var inputValuesForNode = new List <string>();
                if (!String.IsNullOrEmpty(result))
                {
                    inputValuesForNode.Add(result);
                }

                inputValuesForNode.AddRange(model.NodeInputValues.Where(x => x.NodeId == nodes[i].Id).Select(x => x.Value).ToList());

                var res = await nodes[i].GetNodeResultAsync(new Common.Models.NodeRequestModel()
                {
                    InputData = inputValuesForNode
                });

                if (!res.isSuccessful)
                {
                    model.Error = res.ToStringErrors();
                    break;
                }

                result = res.result.OutputData;

                i++;
            } while (i < count);

            if (String.IsNullOrEmpty(model.Error))
            {
                var finalResult = result;

                model.Result = finalResult;
            }

            return(View(model));
        }