name: Run QA Test # Runs automated tests on a self-hosted QA machine
permissions:
  contents: read
  #pull-requests: write # maybe need to re-add this later

on:
  workflow_run:
    workflows: ["Build"]
    types:
      - completed

concurrency:
  group: qa-test-run
  cancel-in-progress: true  # Cancels any queued job when a new one starts

jobs:
  debug-workflow:
    runs-on: ubuntu-latest
    steps:
      - name: Debug Workflow Variables
        env:
          HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }}
          HEAD_COMMIT_MSG: ${{ github.event.workflow_run.head_commit.message }}
        run: |
          echo "Workflow Conclusion: ${{ github.event.workflow_run.conclusion }}"
          echo "Workflow Head Branch: $HEAD_BRANCH"
          echo "Workflow Run ID: ${{ github.event.workflow_run.id }}"
          echo "Head Commit Message: $HEAD_COMMIT_MSG"
          echo "GitHub Ref: ${{ github.ref }}"
          echo "GitHub Ref Name: ${{ github.ref_name }}"
          echo "GitHub Event Name: ${{ github.event_name }}"
          echo "GitHub Workflow Name: ${{ github.workflow }}"

  install-viewer-and-run-tests:
    runs-on: [self-hosted, qa-machine]
    # Run test only on successful builds of Second_Life_X branches
    if: >
      github.event.workflow_run.conclusion == 'success' &&
      (
        startsWith(github.event.workflow_run.head_branch, 'Second_Life')
      )

    steps:
      - name: Temporarily Allow PowerShell Scripts (Process Scope)
        run: |
          Set-ExecutionPolicy RemoteSigned -Scope Process -Force

      - name: Verify viewer-sikulix-main Exists
        run: |
          if (-Not (Test-Path -Path 'C:\viewer-sikulix-main')) {
            Write-Host '❌ Error: viewer-sikulix not found on runner!'
            exit 1
          }
          Write-Host '✅ viewer-sikulix is already available.'

      - name: Fetch & Download Windows Installer Artifact
        shell: pwsh
        run: |
          $BUILD_ID = "${{ github.event.workflow_run.id }}"
          $ARTIFACTS_URL = "https://api.github.com/repos/secondlife/viewer/actions/runs/$BUILD_ID/artifacts"

          # Fetch the correct artifact URL
          $response = Invoke-RestMethod -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}" } -Uri $ARTIFACTS_URL
          $ARTIFACT_NAME = ($response.artifacts | Where-Object { $_.name -eq "Windows-installer" }).archive_download_url

          if (-Not $ARTIFACT_NAME) {
            Write-Host "❌ Error: Windows-installer artifact not found!"
            exit 1
          }

          Write-Host "✅ Artifact found: $ARTIFACT_NAME"

          # Secure download path
          $DownloadPath = "$env:TEMP\secondlife-build-$BUILD_ID"
          New-Item -ItemType Directory -Path $DownloadPath -Force | Out-Null
          $InstallerPath = "$DownloadPath\installer.zip"

          # Download the ZIP
          Invoke-WebRequest -Uri $ARTIFACT_NAME -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}"} -OutFile $InstallerPath

          # Ensure download succeeded
          if (-Not (Test-Path $InstallerPath)) {
            Write-Host "❌ Error: Failed to download Windows-installer.zip"
            exit 1
          }

      - name: Extract Installer & Locate Executable
        shell: pwsh
        run: |
          # Explicitly set BUILD_ID again (since it does not appear to persist across steps)
          $BUILD_ID = "${{ github.event.workflow_run.id }}"
          $ExtractPath = "$env:TEMP\secondlife-build-$BUILD_ID"
          $InstallerZip = "$ExtractPath\installer.zip"

          # Print paths for debugging
          Write-Host "Extract Path: $ExtractPath"
          Write-Host "Installer ZIP Path: $InstallerZip"

          # Verify ZIP exists before extracting
          if (-Not (Test-Path $InstallerZip)) {
              Write-Host "❌ Error: ZIP file not found at $InstallerZip!"
              exit 1
          }

          Write-Host "✅ ZIP file exists and is valid. Extracting..."

          Expand-Archive -Path $InstallerZip -DestinationPath $ExtractPath -Force

          # Find installer executable
          $INSTALLER_PATH = (Get-ChildItem -Path $ExtractPath -Filter '*.exe' -Recurse | Select-Object -First 1).FullName

          if (-Not $INSTALLER_PATH -or $INSTALLER_PATH -eq "") {
            Write-Host "❌ Error: No installer executable found in the extracted files!"
            Write-Host "📂 Extracted Files:"
            Get-ChildItem -Path $ExtractPath -Recurse | Format-Table -AutoSize
            exit 1
          }

          Write-Host "✅ Installer found: $INSTALLER_PATH"
          echo "INSTALLER_PATH=$INSTALLER_PATH" | Out-File -FilePath $env:GITHUB_ENV -Append

      - name: Install Second Life Using Task Scheduler (Bypass UAC)
        shell: pwsh
        run: |
          $action = New-ScheduledTaskAction -Execute "${{ env.INSTALLER_PATH }}" -Argument "/S"
          $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
          $task = New-ScheduledTask -Action $action -Principal $principal
          Register-ScheduledTask -TaskName "SilentSLInstaller" -InputObject $task -Force
          Start-ScheduledTask -TaskName "SilentSLInstaller"

      - name: Wait for Installation to Complete
        shell: pwsh
        run: |
          Write-Host "Waiting for the Second Life installer to finish..."
          do {
            Start-Sleep -Seconds 5
            $installerProcess = Get-Process | Where-Object { $_.Path -eq "${{ env.INSTALLER_PATH }}" }
          } while ($installerProcess)

          Write-Host "✅ Installation completed!"

      - name: Cleanup Task Scheduler Entry
        shell: pwsh
        run: |
          Unregister-ScheduledTask -TaskName "SilentSLInstaller" -Confirm:$false
          Write-Host "✅ Task Scheduler entry removed."

      - name: Delete Installer ZIP
        shell: pwsh
        run: |
          # Explicitly set BUILD_ID again
          $BUILD_ID = "${{ github.event.workflow_run.id }}"
          $DeletePath = "$env:TEMP\secondlife-build-$BUILD_ID\installer.zip"

          Write-Host "Checking if installer ZIP exists: $DeletePath"

          # Ensure the ZIP file exists before trying to delete it
          if (Test-Path $DeletePath) {
              Remove-Item -Path $DeletePath -Force
              Write-Host "✅ Successfully deleted: $DeletePath"
          } else {
              Write-Host "⚠️ Warning: ZIP file does not exist, skipping deletion."
          }

      - name: Run QA Test Script
        run: |
          Write-Host "Running QA Test script..."
          python C:\viewer-sikulix-main\runTests.py

      # - name: Upload Test Results
      #   uses: actions/upload-artifact@v3
      #   with:
      #     name: test-results
      #     path: C:\viewer-sikulix-main\regressionTest\test_results.html
