parameters:
  - name: additionalBuildArguments
    type: string
    default: ''
  - name: enableCaching
    type: boolean
    default: false

steps:
- checkout: self
  fetchDepth: 1
  submodules: true
  clean: true

- task: UseDotNet@2
  displayName: 'Use .NET 6 SDK'
  inputs:
    packageType: sdk
    version: '6.x'

- task: PowerShell@2
  displayName: Verify XAML formatting
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\applyXamlStyling.ps1'
    arguments: -Passive
    pwsh: true

- task: PowerShell@2
  displayName: Verify Nuget package versions for PowerToys.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyNugetPackages.ps1'
    arguments: -solution '$(build.sourcesdirectory)\PowerToys.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for PowerToys.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\PowerToys.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for BugReportTool.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\tools\BugReportTool\BugReportTool.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for WebcamReportTool.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\tools\WebcamReportTool\WebcamReportTool.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for StylesReportTool.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\tools\StylesReportTool\StylesReportTool.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for PowerToysSetup.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify and set latest VCToolsVersion usage
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyAndSetLatestVCToolsVersion.ps1'
    pwsh: true

- task: UseDotNet@2
  displayName: 'Use .NET 8 SDK'
  inputs:
    packageType: sdk
    version: '8.x'
    includePreviewVersions: true

- task: VisualStudioTestPlatformInstaller@1
  displayName: Ensure VSTest Platform

- ${{ if eq(parameters.enableCaching, true) }}:
  - task: NuGetToolInstaller@1
    displayName: Install NuGet

  - script: nuget restore packages.config -SolutionDirectory .
    displayName: 'nuget restore packages.config'

- task: VSBuild@1
  displayName: 'Build and Test PowerToys.sln'
  inputs:
    solution: '**\PowerToys.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    ${{ if eq(parameters.enableCaching, true) }}:
      msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -t:Build;Test -graph -reportfileaccesses -p:MSBuildCacheEnabled=true -p:MSBuildCacheLogDirectory=$(Build.ArtifactStagingDirectory)\logs\MSBuildCache -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToys.binlog -ds:false
    ${{ else }}:
      msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -t:Build;Test -graph -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToys.binlog -ds:false
    msbuildArchitecture: x64
    maximumCpuCount: true
  ${{ if eq(parameters.enableCaching, true) }}:
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

- task: VSBuild@1
  displayName: 'Build BugReportTool.sln'
  inputs:
    solution: '**\BugReportTool.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -graph -bl:$(Build.ArtifactStagingDirectory)\logs\BugReportTool.binlog -ds:false
    msbuildArchitecture: x64
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build WebcamReportTool.sln'
  inputs:
    solution: '**\WebcamReportTool.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -graph -bl:$(Build.ArtifactStagingDirectory)\logs\WebcamReportTool.binlog -ds:false
    msbuildArchitecture: x64
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build StylesReportTool.sln'
  inputs:
    solution: '**\StylesReportTool.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -graph -bl:$(Build.ArtifactStagingDirectory)\logs\StylesReportTool.binlog -ds:false
    msbuildArchitecture: x64
    maximumCpuCount: true

- task: PowerShell@2
  displayName: Download and install WiX 3.14 development build
  inputs:
    targetType: filePath
    filePath: '$(build.sourcesdirectory)\.pipelines\installWiX.ps1'

- task: VSBuild@1
  displayName: 'Build PowerToys per-machine MSI'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysInstaller -restore ${{ parameters.additionalBuildArguments }} -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysInstaller.binlog -ds:false
    msbuildArchitecture: x64
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build PowerToys per-machine Bootstrapper'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysBootstrapper ${{ parameters.additionalBuildArguments }} -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysBootstrapper.binlog -ds:false
    clean: false
    msbuildArchitecture: x64
    maximumCpuCount: true

- task: PowerShell@2
  displayName: Clean installer dir before building per-user installer
  inputs:
    targetType: inline
    script: git clean -xfd  -e *exe -- .\installer\
    pwsh: true

- task: VSBuild@1
  displayName: 'Build PowerToys per-user MSI'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysInstaller -restore ${{ parameters.additionalBuildArguments }} /p:PerUser=true -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysInstaller-PerUser.binlog -ds:false
    msbuildArchitecture: x64
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build PowerToys per-user Bootstrapper'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysBootstrapper ${{ parameters.additionalBuildArguments }} /p:PerUser=true -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysBootstrapper-PerUser.binlog -ds:false
    clean: false
    msbuildArchitecture: x64
    maximumCpuCount: true

# Check if deps.json files don't reference different dll versions.
- task: PowerShell@2
  displayName: Audit deps.json files for all applications
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyDepsJsonLibraryVersions.ps1'
    arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
    pwsh: true

# Check if asset files on the main application paths are playing nice and avoiding basic conflicts.
- task: PowerShell@2
  displayName: Audit base applications path asset conflicts
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyPossibleAssetConflicts.ps1'
    arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
    pwsh: true

- task: PowerShell@2
  displayName: Audit WinAppSDK applications path asset conflicts
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyPossibleAssetConflicts.ps1'
    arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)\WinUI3Apps'
    pwsh: true

# Publish test results which ran in MSBuild
- task: PublishTestResults@2
  displayName: 'Publish Test Results'
  inputs:
    testResultsFormat: VSTest
    testResultsFiles: '**/*.trx'
  condition: always()

# Native dlls
- task: VSTest@2
  condition: ne(variables['BuildPlatform'],'arm64') # No arm64 agents to run the tests.
  displayName: 'Native Tests'
  inputs:
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\KeyboardManagerEngineTest.dll
      **\KeyboardManagerEditorTest.dll
      **\UnitTests-CommonLib.dll
      **\PowerRenameUnitTests.dll
      **\UnitTests-FancyZones.dll
      !**\obj\**

- task: PowerShell@2
  displayName: Trigger dotnet welcome message so that it does not cause errors on other scripts
  inputs:
    targetType: 'inline'
    script: |
      dotnet list $(build.sourcesdirectory)\src\common\Common.UI\Common.UI.csproj package

- task: PowerShell@2
  displayName: Verify Notice.md and Nuget packages match
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyNoticeMdAgainstNugetPackages.ps1'
    arguments: -path '$(build.sourcesdirectory)\'
    pwsh: true

- publish: $(Build.ArtifactStagingDirectory)\logs
  displayName: Publish Logs
  artifact: '$(System.JobDisplayName) logs'
  condition: always()

- task: CopyFiles@2
  displayName: Copy Build Files
  condition: and(succeeded(), ne(variables['BuildPlatform'],'arm64')) 
  inputs:
    sourceFolder: '$(Build.SourcesDirectory)'
    contents: '$(BuildPlatform)/$(BuildConfiguration)/**/*'
    targetFolder: '$(Build.ArtifactStagingDirectory)\$(BuildPlatform)\$(BuildConfiguration)'

- publish: $(Build.ArtifactStagingDirectory)\$(BuildPlatform)\$(BuildConfiguration)
  displayName: Publish Build Artifacts
  artifact: build-$(BuildPlatform)-$(BuildConfiguration)
  condition: and(succeeded(), ne(variables['BuildPlatform'],'arm64')) 
