private static IEnumerable <HtmlExceptionCategoryCount> GetHtmlExceptionCategories(
     [NotNull] IIssueStatistics issueStatistics,
     [NotNull] IssueGroup issueGroup)
 {
     return(issueStatistics.ExceptionCategories.Select(
                category => new HtmlExceptionCategoryCount(
                    category,
                    issueGroup.GetExceptionCount(category))));
 }
        public static List <HtmlReportDataQualityCategory> GroupByCategories(
            [NotNull] IIssueStatistics issueStatistics,
            [NotNull] HtmlReportDataQualityCategoryComparer categoryComparer,
            [NotNull] HtmlReportQualityConditionComparer qualityConditionComparer,
            [NotNull] HtmlReportIssueGroupComparer issueGroupComparer,
            [CanBeNull] Func <IssueGroup, string> getTestIdentifier,
            [CanBeNull] IHtmlDataQualityCategoryOptionsProvider optionsProvider,
            [NotNull] out List <HtmlReportIssueGroup> htmlReportIssueGroups)
        {
            List <IssueGroup> issueGroupList = issueStatistics.GetIssueGroups().ToList();

            IDictionary <string, HtmlReportDataQualityCategory> reportCategories =
                MapReportCategories(issueGroupList,
                                    issueStatistics.ExceptionCategories,
                                    categoryComparer,
                                    qualityConditionComparer,
                                    issueGroupComparer,
                                    optionsProvider);

            int maximumIssueCount = GetMaximumIssueCount(issueGroupList);

            htmlReportIssueGroups = new List <HtmlReportIssueGroup>();

            foreach (IssueGroup issueGroup in issueGroupList)
            {
                string testIdentifier = getTestIdentifier != null
                                                                ? getTestIdentifier(issueGroup)
                                                                : issueGroup.QualityCondition.TestDescriptor.Name;

                var reportIssueGroup = new HtmlReportIssueGroup(issueGroup,
                                                                maximumIssueCount,
                                                                testIdentifier,
                                                                GetHtmlExceptionCategories(
                                                                    issueStatistics, issueGroup));

                HtmlReportDataQualityCategory reportCategory =
                    reportCategories[GetCategoryKey(issueGroup.QualityCondition.Category)];

                reportCategory.AddIssueGroup(reportIssueGroup, issueGroup.IssueCount);
                htmlReportIssueGroups.Add(reportIssueGroup);
            }

            htmlReportIssueGroups.Sort(issueGroupComparer);

            // exclude undefined root category if it does not contain any quality conditions

            return(reportCategories.Values
                   .Where(cat => !cat.IsRoot ||
                          !cat.IsUndefinedCategory ||
                          cat.QualityConditions.Count > 0)
                   .Distinct()
                   .OrderBy(c => c, categoryComparer)
                   .ToList());
        }
        public HtmlReportModel(
            [NotNull] QualitySpecification qualitySpecification,
            [NotNull] IIssueStatistics statistics,
            [NotNull] XmlVerificationReport verificationReport,
            [NotNull] string outputDirectoryPath,
            [NotNull] string verificationReportName,
            [CanBeNull] string issueGeodatabasePath,
            [CanBeNull] IEnumerable <string> issueMapFilePaths,
            [NotNull] IEnumerable <string> htmlReportFileNames,
            [CanBeNull] IEnumerable <string> qualitySpecificationReportFilePaths,
            [NotNull] IHtmlDataQualityCategoryOptionsProvider categoryOptionsProvider)
        {
            Assert.ArgumentNotNull(qualitySpecification, nameof(qualitySpecification));
            Assert.ArgumentNotNull(statistics, nameof(statistics));
            Assert.ArgumentNotNull(verificationReport, nameof(verificationReport));
            Assert.ArgumentNotNullOrEmpty(outputDirectoryPath, nameof(outputDirectoryPath));
            Assert.ArgumentNotNullOrEmpty(verificationReportName,
                                          nameof(verificationReportName));
            Assert.ArgumentNotNull(categoryOptionsProvider, nameof(categoryOptionsProvider));

            _verificationReport = verificationReport;
            HtmlReportFiles     =
                htmlReportFileNames.Select(
                    fileName =>
                    new OutputFile(
                        Path.Combine(outputDirectoryPath, fileName)))
                .ToList();
            IssueMapFiles = issueMapFilePaths?.Select(path => new OutputFile(path))
                            .ToList() ?? new List <OutputFile>();
            QualitySpecificationReportFiles =
                qualitySpecificationReportFilePaths?.Select(path => new OutputFile(path))
                .ToList() ?? new List <OutputFile>();

            Properties               = new NameValuePairs(GetProperties(verificationReport.Properties));
            QualitySpecification     = qualitySpecification.Name;
            VerificationWasCancelled = verificationReport.Cancelled;
            HasVerificationExtent    = verificationReport.TestExtent != null;

            if (verificationReport.TestExtent != null)
            {
                VerificationExtentString = HtmlReportUtils.FormatExtent(
                    verificationReport.TestExtent);
            }

            if (verificationReport.AreaOfInterest != null)
            {
                AreaOfInterest = HtmlReportUtils.GetAreaOfInterest(
                    verificationReport.AreaOfInterest);
            }

            OutputDirectoryPath        = outputDirectoryPath;
            OutputDirectoryName        = Assert.NotNull(Path.GetFileName(outputDirectoryPath));
            OutputDirectoryRelativeUrl = HtmlReportUtils.GetRelativeUrl(string.Empty);
            OutputDirectoryAbsoluteUrl = outputDirectoryPath;

            VerificationReportName = verificationReportName;
            VerificationReportUrl  = HtmlReportUtils.GetRelativeUrl(verificationReportName);

            if (IssueMapFiles.Count > 0)
            {
                OutputFile issueMapFile = IssueMapFiles[0];

                MapDocumentName = issueMapFile.FileName;
                MapDocumentUrl  = issueMapFile.Url;
            }

            IssueGeodatabaseName = Path.GetFileName(issueGeodatabasePath);

            List <HtmlReportDataQualityCategory> categories =
                HtmlReportUtils.GroupByCategories(
                    statistics,
                    new HtmlReportDataQualityCategoryComparer(),
                    new HtmlReportQualityConditionComparer(),
                    new HtmlReportIssueGroupComparer(),
                    GetTestIdentifier,
                    categoryOptionsProvider,
                    out _issueGroups);

            CategoriesWithIssues = categories.Where(c => c.IssueGroups.Count > 0).ToList();
            RootCategories       = categories.Where(c => c.IsRoot).ToList();

            HasWarnings = statistics.WarningCount > 0;
            HasErrors   = statistics.ErrorCount > 0;
            HasIssues   = !HasWarnings && !HasErrors;

            IssueCount = HtmlReportUtils.Format(statistics.WarningCount +
                                                statistics.ErrorCount);
            WarningCount   = HtmlReportUtils.Format(statistics.WarningCount);
            ErrorCount     = HtmlReportUtils.Format(statistics.ErrorCount);
            ExceptionCount = HtmlReportUtils.Format(statistics.ExceptionCount);

            TimeSpan t = TimeSpan.FromSeconds(verificationReport.ProcessingTimeSeconds);

            ProcessingTime = HtmlReportUtils.FormatTimeSpan(t);
        }