src/OfficeScrubC2R.Core/ScrubPlanner.cs

namespace OfficeScrubC2R
{
    public static class ScrubPlanner
    {
        public static ScrubPlan CreatePlan(
            OfficeC2RState state,
            bool keepLicense,
            bool planOnly,
            bool keepTeams = false,
            bool keepCopilot = false)
        {
            var plan = new ScrubPlan
            {
                KeepLicense = keepLicense,
                KeepTeams = keepTeams,
                KeepCopilot = keepCopilot,
                PlanOnly = planOnly,
                State = state,
                ExecutionStatus = planOnly ? "PlanOnly" : "Ready",
                Message = planOnly
                    ? "The plan describes the cleanup actions Invoke-OfficeScrubC2R will run outside -PlanOnly/-WhatIf."
                    : "The cleanup plan is ready to execute."
            };
 
            plan.PlannedOperations.Add(OperationResult.WouldRun(
                "Preflight",
                "ValidatePrivileges",
                "Privilege",
                "Administrator",
                "Validate elevation before destructive cleanup."));
 
            plan.PlannedOperations.Add(OperationResult.WouldRun(
                "Processes",
                "TerminateOfficeProcesses",
                "ProcessSet",
                "OfficeProcesses",
                "Terminate Office-related processes."));
 
            plan.PlannedOperations.Add(OperationResult.WouldRun(
                "Services",
                "StopAndDeleteClickToRunServices",
                "ServiceSet",
                "ClickToRunSvc,OfficeClickToRun",
                "Stop and delete Click-to-Run services."));
 
            plan.PlannedOperations.Add(OperationResult.WouldRun(
                "Registry",
                "RemoveClickToRunRegistry",
                "RegistryKeySet",
                @"HKLM/HKCU Office ClickToRun keys",
                "Remove Office Click-to-Run registry keys through explicit 32-bit and 64-bit registry views."));
 
            plan.PlannedOperations.Add(OperationResult.WouldRun(
                "Files",
                "RemoveClickToRunFiles",
                "DirectorySet",
                "Detected Office package paths",
                "Remove Office package files and schedule locked files for reboot deletion."));
 
            plan.PlannedOperations.Add(keepLicense
                ? OperationResult.Skipped(
                    "Licensing",
                    "RemoveOfficeLicensing",
                    "LicenseStore",
                    "Office licensing data",
                    "License cleanup skipped because KeepLicense was requested.")
                : OperationResult.WouldRun(
                    "Licensing",
                    "RemoveOfficeLicensing",
                    "LicenseStore",
                    "Office licensing data",
                    "Remove Office licensing data."));
 
            plan.PlannedOperations.Add(keepTeams && keepCopilot
                ? OperationResult.Skipped(
                    "CompanionApps",
                    "RemoveTeamsAndCopilot",
                    "AppxPackageSet",
                    "Microsoft Teams,Microsoft Copilot",
                    "Teams and Copilot cleanup skipped because KeepTeams and KeepCopilot were requested.")
                : OperationResult.WouldRun(
                    "CompanionApps",
                    "RemoveTeamsAndCopilot",
                    "AppxPackageSet",
                    GetCompanionPlanTarget(keepTeams, keepCopilot),
                    "Remove Office-adjacent Teams and Copilot local app packages and remnants."));
 
            return plan;
        }
 
        private static string GetCompanionPlanTarget(bool keepTeams, bool keepCopilot)
        {
            if (keepTeams)
            {
                return "Microsoft Copilot";
            }
 
            return keepCopilot ? "Microsoft Teams" : "Microsoft Teams,Microsoft Copilot";
        }
    }
}