private string GetReportOutputConfiguration(int reportId, int userId, IEnumerable<ReportColumn> columnsSwapHistory, IEnumerable<ReportColumn> columnsWidthHistory)
        {
            var userReport = GetUserReport(reportId, userId);

            var columnsConfig = new JavaScriptSerializer().Deserialize<List<ReportColumn>>(userReport.OutputConfiguration);

            columnsConfig.ForEach(reportConfig =>
            {
                var lastIndex = columnsSwapHistory.LastOrDefault(columnSwap => columnSwap.Name == reportConfig.Name);

                //There was an index change so an offset has to be performed
                if (!lastIndex.IsNull())
                {
                    //Right offset
                    if (lastIndex.Index > reportConfig.Index)
                    {
                        foreach (var column in columnsConfig.Where(colum => colum.Index <= lastIndex.Index && colum.Index > reportConfig.Index))
                            column.Index--;
                    }
                    else
                    {
                        //Left offset
                        foreach (var column in columnsConfig.Where(colum => colum.Index >= lastIndex.Index && colum.Index < reportConfig.Index))
                            column.Index++;
                    }

                    reportConfig.Index = lastIndex.Index;
                }

                var lastWidth = columnsWidthHistory.LastOrDefault(columnWidth => columnWidth.Name == reportConfig.Name);

                if (!lastWidth.IsNull())
                    reportConfig.Width = lastWidth.Width;
            });

            var jsonResult = new JsonSerializer().Serialize(columnsConfig);

            return jsonResult;
        }