name: Update RDPWrapOffsetFinder tools

# Run manually to pull a new version of llccd/RDPWrapOffsetFinder into tools/.
# The workflow commits the updated binaries and opens a pull request.
on:
  workflow_dispatch:
    inputs:
      tag:
        description: "llccd release tag to fetch (leave blank for latest)"
        required: false
        default: ""

env:
  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

permissions:
  contents: write
  pull-requests: write

jobs:
  update:
    runs-on: windows-2022

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Download and extract RDPWrapOffsetFinder
        id: fetch
        shell: pwsh
        run: |
          $tag = "${{ github.event.inputs.tag }}"
          if ($tag -eq "") {
            $apiUrl = "https://api.github.com/repos/llccd/RDPWrapOffsetFinder/releases/latest"
          } else {
            $apiUrl = "https://api.github.com/repos/llccd/RDPWrapOffsetFinder/releases/tags/$tag"
          }

          $release = Invoke-RestMethod -Uri $apiUrl -Headers @{ "User-Agent" = "rdpwrap-ci" }
          $version = $release.tag_name
          Write-Host "Fetching version $version"

          $asset = $release.assets | Where-Object { $_.name -like "*.zip" } | Select-Object -First 1
          if (-not $asset) { throw "No zip asset found in release $version" }

          Invoke-WebRequest -Uri $asset.browser_download_url -OutFile finder.zip
          Expand-Archive -Path finder.zip -DestinationPath .\finder -Force

          Write-Host "Zip contents:"
          Get-ChildItem -Recurse .\finder | Select-Object FullName

          function Get-Bin($pattern, $hint) {
            $hits = Get-ChildItem -Recurse -Filter $pattern .\finder
            $m = $hits | Where-Object { $_.FullName -match $hint } | Select-Object -First 1
            if (-not $m) { $m = $hits | Select-Object -First 1 }
            return $m
          }

          $x64exe = Get-Bin "RDPWrapOffsetFinder*.exe" "x64"
          $x86exe = Get-Bin "RDPWrapOffsetFinder*.exe" "x86|Win32|32"
          $x64dll = Get-Bin "Zydis*.dll"               "x64"
          $x86dll = Get-Bin "Zydis*.dll"               "x86|Win32|32"

          if (-not $x86exe) { $x86exe = $x64exe }
          if (-not $x86dll) { $x86dll = $x64dll }
          if (-not $x64exe) { throw "Could not locate exe" }
          if (-not $x64dll) { throw "Could not locate dll" }

          New-Item -ItemType Directory -Path tools\RDPWrapOffsetFinder\x64 -Force | Out-Null
          New-Item -ItemType Directory -Path tools\RDPWrapOffsetFinder\x86 -Force | Out-Null

          Copy-Item $x64exe.FullName tools\RDPWrapOffsetFinder\x64\RDPWrapOffsetFinder.exe -Force
          Copy-Item $x64dll.FullName tools\RDPWrapOffsetFinder\x64\Zydis.dll               -Force
          Copy-Item $x86exe.FullName tools\RDPWrapOffsetFinder\x86\RDPWrapOffsetFinder.exe -Force
          Copy-Item $x86dll.FullName tools\RDPWrapOffsetFinder\x86\Zydis.dll               -Force
          Set-Content -Path tools\RDPWrapOffsetFinder\VERSION -Value $version

          Write-Host "Staged tools:"
          Get-ChildItem -Recurse tools\RDPWrapOffsetFinder | Select-Object FullName, Length

          echo "version=$version" >> $env:GITHUB_OUTPUT

      - name: Commit and push to a new branch
        shell: pwsh
        run: |
          $version = "${{ steps.fetch.outputs.version }}"
          $branch  = "chore/update-finder-tools-$version"

          git config user.name  "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git checkout -b $branch
          git add tools/RDPWrapOffsetFinder
          git diff --cached --quiet && { Write-Host "No changes - tools already up to date"; exit 0 }
          git commit -m "chore: update RDPWrapOffsetFinder tools to $version"
          git push origin $branch
          echo "branch=$branch" >> $env:GITHUB_OUTPUT
        id: push

      - name: Create pull request
        if: steps.push.outputs.branch != ''
        shell: pwsh
        run: |
          $version = "${{ steps.fetch.outputs.version }}"
          $branch  = "${{ steps.push.outputs.branch }}"
          gh pr create `
            --title "chore: update RDPWrapOffsetFinder tools to $version" `
            --body "Automated update of the committed RDPWrapOffsetFinder binaries in ``tools/RDPWrapOffsetFinder/`` to upstream release $version.`` Triggered manually via the Update RDPWrapOffsetFinder tools workflow.`` Merge to include the updated binaries in the next INI release." `
            --base master `
            --head $branch
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
