public void RunReport()
        {
            GenerateReportIntro();

            GenerateReport();
            if (ProgressProvider.CancelRequested)
            {
                return;
            }
            ProgressProvider.UpdateProgress("Writing the report");
            WriteReportToFile();
        }
        /// <summary>
        /// Looks for all the nodes with the same action line, but different board cards.
        /// </summary>
        public List <IServerNode> FindSimilarNodesOnOtherBoards(IServerNode node)
        {
            Stack <IServerNode> fullPath = new Stack <IServerNode>();

            for (IServerNode temp = node; temp.Parent != null; temp = temp.Parent)
            {
                fullPath.Push(temp);
            }

            List <IServerNode> allSimilar = new List <IServerNode>();

            allSimilar.Add(fullPath.Pop());
            List <IServerNode> tempList = new List <IServerNode>();

            int progressReportingPathIndex = 0;
            int progressReportingPathTotal = fullPath.Count;

            while (fullPath.Count > 0)
            {
                var pattern = fullPath.Pop();

                int progressReportingNodeIndex = 1;
                progressReportingPathIndex++;

                foreach (var item in allSimilar)
                {
                    ProgressProvider.UpdateProgress("listing nodes. Path (" + progressReportingPathIndex + "/" + progressReportingPathTotal + ") " + progressReportingNodeIndex++ + " nodes");
                    if (ProgressProvider.CancelRequested)
                    {
                        return(new List <IServerNode>());
                    }

                    var itemChildren = Context.ServerWrapper.ShowChildren(item);
                    foreach (var child in itemChildren)
                    {
                        if (child.NodeText == pattern.NodeText || item.NodeType == "SPLIT_NODE")
                        {
                            tempList.Add(child);
                        }
                    }
                }
                allSimilar = tempList;
                tempList   = new List <IServerNode>();
            }
            return(allSimilar);
        }
        /// <summary>
        /// Generate the full report
        /// </summary>
        private void GenerateReport()
        {
            ReportBuilder.AppendLine("");

            ProgressProvider.UpdateProgress("list nodes");


            if (CFRFilePaths == null)
            {
                CFRFilePaths = new List <string>();
                CFRFilePaths.Add(null);
            }

            int loop  = 0;
            int loops = CFRFilePaths.Count;

            foreach (var path in CFRFilePaths)
            {
                loop++;

                if (path != null)
                {
                    ProgressProvider.UpdateProgress("Load file " + loop + " out of " + loops);
                    Context.ServerWrapper.LoadTree(path);
                    Node = Context.ServerWrapper.RefreshNode(Node);
                }

                var similarNodes      = FindSimilarNodesOnOtherBoards(Node);
                int total             = similarNodes.Count;
                int progressNodeCount = 0;

                var root         = Context.ServerWrapper.ShowRootNode();
                var rootMatchups = Context.ServerWrapper.CalcEquityInNode(Context.ServerUtils.IP, root).TotalMatchups();

                var results = new List <ReportLine>();

                foreach (var singleNode in similarNodes)
                {
                    progressNodeCount++;
                    if (ProgressProvider.CancelRequested)
                    {
                        return;
                    }
                    if (loops > 1)
                    {
                        ProgressProvider.UpdateProgress("file " + loop + " out of " + loops + ". Analyse " + string.Join("", singleNode.Board.ToList()) + " " + progressNodeCount + " out of " + total);
                    }
                    else
                    {
                        ProgressProvider.UpdateProgress("Analyze " + string.Join("", singleNode.Board.ToList()) + " " + progressNodeCount + " out of " + total);
                    }
                    results.Add(ReportLine.CreateReportLineForNode(singleNode, this.Context));
                }
                var summaryResult = ReportLine.ToSummaryCSVLine(results);

                if (loop == 1)
                {
                    ReportBuilder.AppendLine(string.Join(",", GenerateHeaderNames(summaryResult.ActionNames)));
                }

                if (results.Count > 1)
                {
                    ReportBuilder.AppendLine(string.Join(",", summaryResult.ToCSVLine(rootMatchups)));
                }

                foreach (var resultLine in results)
                {
                    ReportBuilder.AppendLine(string.Join(",", resultLine.ToCSVLine(rootMatchups)));
                }
            }
        }