lib/actions/releases/SetLatestReleaseAction/SetLatestReleaseAction.ps1

##############################################################################
# SetLatestReleaseAction.ps1 - Set a release as the "latest" release
#############################################################################
# This action updates a release to be marked as the "latest" release in GitHub.
# Used when the wrong release is currently marked as latest.
#############################################################################

class SetLatestReleaseAction : ReleaseRemediationAction {
    [int]$ReleaseId
    
    SetLatestReleaseAction([string]$tagName) : base("Set release as latest", $tagName) {
        $this.ReleaseId = 0  # Will be looked up if needed
        $this.Priority = 50  # Run after other release operations
    }
    
    SetLatestReleaseAction([string]$tagName, [int]$releaseId) : base("Set release as latest", $tagName) {
        $this.ReleaseId = $releaseId
        $this.Priority = 50  # Run after other release operations
    }
    
    [bool] Execute([RepositoryState]$state) {
        Write-Host "Auto-fix: Set release $($this.TagName) as latest"
        
        # If ReleaseId is not provided, look it up from state
        $targetReleaseId = $this.ReleaseId
        if (-not $targetReleaseId -or $targetReleaseId -eq 0) {
            $release = $state.Releases | Where-Object { $_.TagName -eq $this.TagName } | Select-Object -First 1
            if ($release) {
                $targetReleaseId = $release.Id
            }
        }
        
        if (-not $targetReleaseId -or $targetReleaseId -eq 0) {
            Write-Host "✗ Failed: Could not find release ID for $($this.TagName)"
            return $false
        }
        
        $result = Set-GitHubReleaseLatest -State $state -TagName $this.TagName -ReleaseId $targetReleaseId
        
        if ($result.Success) {
            Write-Host "✓ Success: Set release $($this.TagName) as latest"
            return $true
        } else {
            if ($this.IsUnfixableError($result)) {
                $this.MarkAsUnfixable($state, "wrong_latest_release", "Cannot set $($this.TagName) as latest release")
            } else {
                Write-Host "✗ Failed: Set release $($this.TagName) as latest"
            }
            return $false
        }
    }
    
    [string[]] GetManualCommands([RepositoryState]$state) {
        # Check if the issue is unfixable - if so, return empty array
        if ($this.IsIssueUnfixable($state, "wrong_latest_release")) {
            return @()
        }
        
        $repoArg = ""
        if ($state.RepoOwner -and $state.RepoName) {
            $repoArg = " --repo $($state.RepoOwner)/$($state.RepoName)"
        }
        return @("gh release edit $($this.TagName)$repoArg --latest")
    }
}