public SitecoreMigrator(DTE applicationObject) : base(applicationObject)
        {
            sitecoreVersionList = SitecoreVersionConfigManager.GetSupportedSitecoreVersions();
            var folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            pkgMnger = new PackageServices();
        }
        private void RefactorGlassReferences(Action <int, object> progressReport)
        {
            progressReport(-1, "Started package migration...");
            var sitecoreConfigModel = SitecoreVersionConfigManager.GetSitecoreConfigModel(projectsUpdateList.SelectedSitecoreVersion.Id);

            if (sitecoreConfigModel.Error != null)
            {
                progressReport(-1, sitecoreConfigModel.Error);
                return;
            }

            var hostProject = projectsUpdateList.Projects.FirstOrDefault(p => p.IsSelected);
            // check if host proj has the necessary Packages included.
            var installedPackages = pkgMnger.GetInstalledNugetPackages(hostProject.DteProject);
            var missingPackages   = sitecoreConfigModel.GlassPackages.Where(x => !installedPackages.Contains(x));

            foreach (var aPackage in missingPackages)
            {
                pkgMnger.UpdatePackage(hostProject.DteProject, aPackage, false);
            }

            // Add the abstraction class to a foundation projects
            var refactoringService = new GlassRefactorService();

            progressReport(1, $"Trying to add the abstraction classes to project {hostProject.Name} ");
            if (!refactoringService.AddAbstractionClass(hostProject.DteProject, _glassAbstractionFolderName))
            {
                progressReport(-2, refactoringService.ErrorMessage);
                return;
            }


            var selectedProjects = projectsUpdateList.Projects.Where(p => p.IsSelected);

            foreach (var project in selectedProjects)
            {
                foreach (ProjectItem item in project.DteProject.ProjectItems)
                {
                    //check if it is a class file
                    //check if file has reference to ISitecoreContext
                    if (!item.Name.Contains(".cs") || !File.ReadLines(item.Document.FullName)
                        .SkipWhile(x => !x.Contains("ISitecoreContext"))
                        .TakeWhile(line => !line.Contains("ISitecoreContext")).Any())
                    {
                        continue;
                    }
                    //add reference to IItemRepository
                    //item.FileCodeModel.CodeElements.;
                    // replace references to ISitecoreContext with IItemRepor
                }
            }
        }
        void UpdateMSSCPkgFired(Action <int, object> progressReport)
        {
            progressReport(0, "Started SC + MS Update...");
            var sitecoreConfigModel = SitecoreVersionConfigManager.GetSitecoreConfigModel(projectsUpdateList.SelectedSitecoreVersion.Id);

            if (sitecoreConfigModel.Error != null)
            {
                progressReport(-1, sitecoreConfigModel.Error);
                return;
            }


            var selectedProjects = projectsUpdateList.Projects.Where(p => p.IsSelected);
            var count            = selectedProjects.Count();
            var i = 1;

            foreach (var prj in selectedProjects)
            {
                progressReport(GetPercentage(i, count), $"Starting project {prj.Name}");
                var prjPkgs = pkgMnger.GetInstalledNugetPackages(prj.DteProject);
                //restoring packages first
                pkgMnger.RestorePackages(prj.DteProject);
                //MSPackages first
                var pkgToUpdate = prjPkgs.Where(x => x.Id.StartsWith("Microsoft."));
                if (pkgToUpdate.Any())
                {
                    UpdateMsPackages(sitecoreConfigModel, prj, pkgToUpdate, prjPkgs, progressReport);
                }

                //Sitecore package second
                pkgToUpdate = prjPkgs.Where(x => x.Id.StartsWith("Sitecore."));
                if (pkgToUpdate.Any())
                {
                    UpdateSCPackages(sitecoreConfigModel, prj, pkgToUpdate, prjPkgs, progressReport);
                }

                //other packages
                pkgToUpdate = prjPkgs.Where(x => !x.Id.StartsWith("Sitecore.") && !x.Id.StartsWith("Microsoft.") && !x.Id.StartsWith("Glass."));
                if (pkgToUpdate.Any())
                {
                    UpdateOtherPackages(sitecoreConfigModel, prj, pkgToUpdate, prjPkgs, progressReport);
                }

                //now build the project so it get saved and references get updated.
                BuildProject(prj);
                i++;
            }

            progressReport(100, "MS + Sitecore has been updated. Please verify and continue");
        }
        private void MigrateToPackageReferencing(Action <int, object> progressReport)
        {
            progressReport(1, "Started package migration...");
            var sitecoreConfigModel = SitecoreVersionConfigManager.GetSitecoreConfigModel(projectsUpdateList.SelectedSitecoreVersion.Id);

            if (sitecoreConfigModel.Error != null)
            {
                progressReport(-1, sitecoreConfigModel.Error);
                return;
            }


            var selectedProjects = projectsUpdateList.Projects.Where(p => p.IsSelected);

            var           dte2        = (DTE2)applicationObject;
            List <string> selectedPrj = selectedProjects.Select(x => x.DteProject.Name).ToList();

            pkgMnger.StartProjectMigration(dte2, applicationObject.Solution.FileName, selectedPrj);
            progressReport(100, "done...");
        }
        void Update(Action <int, object> progressReport)
        {
            progressReport(-1, "Reading config file...");
            var selectedProjects    = projectsUpdateList.Projects.Where(p => p.IsSelected);
            var sitecoreConfigModel = SitecoreVersionConfigManager.GetSitecoreConfigModel(projectsUpdateList.SelectedSitecoreVersion.Id);

            if (sitecoreConfigModel.Error != null)
            {
                progressReport(100, sitecoreConfigModel.Error);
                return;
            }

            progressReport(-1, "Updating dotnet Framework...");

            UpdateFrameworks(selectedProjects, sitecoreConfigModel.Framework, progressReport);

            //projectsUpdateList.EnableNextStep();
            //projectsUpdateList.Projects = LoadProjects();

            progressReport(100, "Dotnet Framework has been updated... please verify and then continue");
        }
        void UpdateGlassPkgFired(Action <int, object> progressReport)
        {
            progressReport(-1, "Started Glass Upgrade...");
            progressReport(-1, "Loading Config...");
            var sitecoreConfigModel = SitecoreVersionConfigManager.GetSitecoreConfigModel(projectsUpdateList.SelectedSitecoreVersion.Id);

            if (sitecoreConfigModel.Error != null)
            {
                progressReport(-1, sitecoreConfigModel.Error);
                return;
            }


            var selectedProjects = projectsUpdateList.Projects.Where(p => p.IsSelected);
            var count            = selectedProjects.Count();
            var i = 1;

            foreach (var prj in selectedProjects)
            {
                progressReport(GetPercentage(i, count), "Starting project " + prj.Name);
                var prjPkgs = pkgMnger.GetInstalledNugetPackages(prj.DteProject);
                //restoring packages first
                pkgMnger.RestorePackages(prj.DteProject);

                var pkgToUpdate = prjPkgs.Where(x => x.Id.StartsWith("Glass."));
                if (pkgToUpdate.Any())
                {
                    UpdateGlassPackages(sitecoreConfigModel, prj, pkgToUpdate, prjPkgs, progressReport);
                }
                //now build the project so it get saved and references get updated.
                BuildProject(prj);
                i++;
            }

            progressReport(-1, "Glass has been updated. Please verify and continue");
        }