parameters:
  - name: includePublicSymbolServer
    type: boolean
    default: false
  - name: pool
    type: object
    default: []
  - name: dependsOn
    type: object
    default: null
  - name: artifactStem
    type: string
    default: ''
  - name: jobName
    type: string
    default: PublishSymbols
  - name: symbolExpiryTime
    type: string
    default: 36530 # This is the default from PublishSymbols@2
  - name: variables
    type: object
    default: {}
  - name: subscription
    type: string
  - name: symbolProject
    type: string

jobs:
- job: ${{ parameters.jobName }}
  ${{ if ne(length(parameters.pool), 0) }}:
    pool: ${{ parameters.pool }}
  ${{ if eq(parameters.includePublicSymbolServer, true) }}:
    displayName: Publish Symbols to Internal and MSDL
  ${{ else }}:
    displayName: Publish Symbols Internally
  dependsOn: ${{ parameters.dependsOn }}
  variables:
    ${{ insert }}: ${{ parameters.variables }}
  steps:
  - checkout: self
    clean: true
    fetchDepth: 1
    fetchTags: false # Tags still result in depth > 1 fetch; we don't need them here
    submodules: true
    persistCredentials: True

  - template: steps-setup-versioning.yml

  - task: DownloadPipelineArtifact@2
    displayName: Download all PDBs from all prior build phases
    inputs:
      itemPattern: '**/*.pdb'
      targetPath: '$(Build.SourcesDirectory)/bin'

  # Transit the Azure token from the Service Connection into a secret variable for the rest of the pipeline to use.
  - task: AzurePowerShell@5
    displayName: Generate an Azure Token
    inputs:
      azureSubscription: ${{ parameters.subscription }}
      azurePowerShellVersion: LatestVersion
      pwsh: true
      ScriptType: InlineScript
      Inline: |-
        $AzToken = (Get-AzAccessToken -AsSecureString -ResourceUrl api://30471ccf-0966-45b9-a979-065dbedb24c1).Token | ConvertFrom-SecureString -AsPlainText
        Write-Host "##vso[task.setvariable variable=SymbolAccessToken;issecret=true]$AzToken"


  - task: PublishSymbols@2
    displayName: Publish Symbols (to current Azure DevOps tenant)
    continueOnError: True
    inputs:
      SymbolsFolder: '$(Build.SourcesDirectory)/bin'
      SearchPattern: '**/*.pdb'
      IndexSources: false
      DetailedLog: true
      SymbolsMaximumWaitTime: 30
      SymbolServerType: 'TeamServices'
      SymbolsProduct: 'Windows Terminal Converged Symbols'
      SymbolsVersion: '$(XES_APPXMANIFESTVERSION)'
      SymbolsArtifactName: 'WindowsTerminal_$(XES_APPXMANIFESTVERSION)'
      SymbolExpirationInDays: ${{ parameters.symbolExpiryTime }}
    env:
      LIB: $(Build.SourcesDirectory)

  - pwsh: |-
      # Prepare the defaults for IRM
      $PSDefaultParameterValues['Invoke-RestMethod:Headers'] = @{ Authorization = "Bearer $(SymbolAccessToken)" }
      $PSDefaultParameterValues['Invoke-RestMethod:ContentType'] = "application/json"
      $PSDefaultParameterValues['Invoke-RestMethod:Method'] = "POST"

      $BaseUri = "https://symbolrequestprod.trafficmanager.net/projects/${{ parameters.symbolProject }}/requests"

      # Prepare the request
      $expiration = (Get-Date).Add([TimeSpan]::FromDays(${{ parameters.symbolExpiryTime }}))
      $createRequestBody = @{
        requestName = "WindowsTerminal_$(XES_APPXMANIFESTVERSION)";
        expirationTime = $expiration.ToString();
      }
      Write-Host "##[debug]Starting request $($createRequestBody.requestName) with expiration date of $($createRequestBody.expirationTime)"
      Invoke-RestMethod -Uri "$BaseUri" -Body ($createRequestBody | ConvertTo-Json -Compress) -Verbose

      # Request symbol publication
      $publishRequestBody = @{
        publishToInternalServer = $true;
        publishToPublicServer = $${{ parameters.includePublicSymbolServer }};
      }
      Write-Host "##[debug]Submitting request $($createRequestBody.requestName) ($($publishRequestBody | ConvertTo-Json -Compress))"
      Invoke-RestMethod -Uri "$BaseUri/$($createRequestBody.requestName)" -Body ($publishRequestBody | ConvertTo-Json -Compress) -Verbose
    displayName: Publish Symbols using internal REST API
