/// <summary>
        /// Creates the specified measure.
        /// </summary>
        /// <param name="measure">The measure.</param>
        /// <returns></returns>
        public static DynamicMeasureDto Create(Measure measure)
        {
            var dto = new DynamicMeasureDto();

            dto.MeasureID                        = measure.Id;
            dto.MeasuresName                     = measure.Name;
            dto.MeasureSource                    = measure.Source;
            dto.MeasureType                      = measure.MeasureType;
            dto.HigherScoresAreBetter            = measure.HigherScoresAreBetter;
            dto.HigherScoresAreBetterDescription = string.Empty;
            dto.TopicsID       = string.Join(",", measure.Topics.Select(t => t.Id).ToArray());
            dto.NatLabel       = string.Empty;
            dto.NatRateAndCI   = string.Empty;
            dto.NatTop10Label  = string.Empty;
            dto.NatTop10       = string.Empty;
            dto.PeerLabel      = string.Empty;
            dto.PeerRateAndCI  = string.Empty;
            dto.PeerTop10Label = string.Empty;
            dto.PeerTop10      = string.Empty;

            dto.Footnote            = measure.Footnotes;
            dto.BarHeader           = string.Empty;
            dto.BarFooter           = string.Empty;
            dto.ColDesc1            = string.Empty;
            dto.ColDesc2            = string.Empty;
            dto.ColDesc3            = string.Empty;
            dto.ColDesc4            = string.Empty;
            dto.ColDesc5            = string.Empty;
            dto.ColDesc6            = string.Empty;
            dto.ColDesc7            = string.Empty;
            dto.ColDesc8            = string.Empty;
            dto.ColDesc9            = string.Empty;
            dto.ColDesc10           = string.Empty;
            dto.NatCol1             = string.Empty;
            dto.NatCol2             = string.Empty;
            dto.NatCol3             = string.Empty;
            dto.NatCol4             = string.Empty;
            dto.NatCol5             = string.Empty;
            dto.NatCol6             = string.Empty;
            dto.NatCol7             = string.Empty;
            dto.NatCol8             = string.Empty;
            dto.NatCol9             = string.Empty;
            dto.NatCol10            = string.Empty;
            dto.PeerCol1            = string.Empty;
            dto.PeerCol2            = string.Empty;
            dto.PeerCol3            = string.Empty;
            dto.PeerCol4            = string.Empty;
            dto.PeerCol5            = string.Empty;
            dto.PeerCol6            = string.Empty;
            dto.PeerCol7            = string.Empty;
            dto.PeerCol8            = string.Empty;
            dto.PeerCol9            = string.Empty;
            dto.PeerCol10           = string.Empty;
            dto.SelectedTitle       = measure.MeasureTitle.Selected == SelectedMeasuretitleEnum.Plain ? measure.MeasureTitle.Plain : measure.MeasureTitle.Clinical;
            dto.PlainTitle          = measure.MeasureTitle.Plain;
            dto.ClinicalTitle       = measure.MeasureTitle.Clinical;
            dto.MeasureDescription  = measure.Description;
            dto.Bullets             = string.Empty;
            dto.StatisticsAvailable = string.Empty;
            dto.MoreInformation     = measure.MoreInformation;
            dto.URL                = measure.Url;
            dto.URLTitle           = measure.UrlTitle;
            dto.DataSourceURL      = measure.Owner.PublisherWebsite;
            dto.DataSourceURLTitle = measure.Owner.Publisher;

            return(dto);
        }
        /// <summary>
        /// Outputs the report data files.
        /// </summary>
        /// <returns></returns>
        protected override bool OutputDataFiles()
        {
            try{
                if (ActiveReport != null)
                {
                    var dataset = CurrentWebsite.Datasets.FirstOrDefault(wd => wd.Dataset.ContentType.IsCustom &&
                                                                         wd.Dataset.ContentType.Name.In(ActiveReport.Datasets));
                    //var report = CurrentWebsite.Reports.FirstOrDefault(wr => wr.Report.ReportType.EqualsIgnoreCase(ActiveReport.ReportType));

                    if (dataset == null)
                    {
                        return(true);
                    }

                    var reportQuery = ParseTokens(ActiveReport.ReportOutputSql, dataset.Dataset); // parse tokens in ReportOutputSql statement

                    var results = RunSqlReturnDataTable(reportQuery, null);                       // Execute query and return results

                    // Format Json/JavaScript namespace for report output
                    var jsonNamespace = !string.IsNullOrEmpty(ActiveReport.OutputJsNamespace)
                                                    ? ActiveReport.OutputJsNamespace.ToLower().Trim()
                                                    : string.Format("$.monahrq.Flutters.{0}.Report.Data=", dataset.Dataset.ContentType.Name.Replace(" ", null)).ToLower();

                    if (!jsonNamespace.StartsWith("$."))
                    {
                        jsonNamespace = string.Format("$.{0}", jsonNamespace);
                    }

                    if (!jsonNamespace.EndsWith("="))
                    {
                        jsonNamespace = string.Format("{0}=", jsonNamespace);
                    }

                    var jsonNamespaceMapping = CreateNameSpaceMapping(jsonNamespace);

                    // Format Json/JavaScript file name for report output
                    var reportFileName = !string.IsNullOrEmpty(ActiveReport.OutputFileName)
                                                    ? ActiveReport.OutputFileName.ToLower().Trim()
                                                    : "report-data.js";

                    if (!reportFileName.EndsWith(".js"))
                    {
                        reportFileName = string.Format("{0}.js", reportFileName);
                    }

                    // Create Wing Output Directory
                    var wingsDirectory    = Path.Combine(BaseDataDirectoryPath, "Wings");
                    var fileDirectoryPath = Path.Combine(wingsDirectory, dataset.Dataset.ContentType.Name.ToLower().Replace(" ", null));

                    if (!Directory.Exists(fileDirectoryPath)) // If doesn't exist then create it.
                    {
                        Directory.CreateDirectory(fileDirectoryPath);
                    }

                    // Create/Generate File
                    GenerateJsonFile(results, Path.Combine(fileDirectoryPath, reportFileName), jsonNamespace, true, jsonNamespaceMapping);


                    // Generating Measures
                    var measuresToUse = CurrentWebsite.Measures.Where(wm => wm.ReportMeasure.Owner != null &&
                                                                      wm.ReportMeasure.Owner.Name.EqualsIgnoreCase(dataset.Dataset.ContentType.Name))
                                        .Select(wm => wm.ReportMeasure)
                                        .ToList();

                    if (measuresToUse.Any())
                    {
                        var measuresDirectory = Path.Combine(wingsDirectory, "Measures");

                        if (!Directory.Exists(measuresDirectory)) // If doesn't exist then create it.
                        {
                            Directory.CreateDirectory(measuresDirectory);
                        }

                        foreach (var measure in measuresToUse)
                        {
                            var measureJsonNamespace = string.Format("$.monahrq.wing.measuredescription_{0}=", measure.Id);
                            var measureFileName      = string.Format("Measure_{0}.js", measure.Id);
                            var measureDto           = DynamicMeasureDto.Create(measure);
                            GenerateJsonFile(measureDto, Path.Combine(measuresDirectory, measureFileName), measureJsonNamespace, true);
                        }
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                Logger.Write(ex, "Error writing data files for dynamic report {0}", this.ActiveReport?.Name);
                return(false);
            }
        }