parameters:
  - name: PackageInfoLocations
    type: object
    default: []
  - name: RepoId
    type: string
    default: $(Build.Repository.Name)
  - name: WorkingDirectory
    type: string
    default: ''
  - name: ScriptDirectory
    type: string
    default: eng/common/scripts
  - name: TargetDocRepoName
    type: string
    default: ''
  - name: TargetDocRepoOwner
    type: string
  - name: Language
    type: string
    default: ''
  - name: DailyDocsBuild
    type: boolean
    default: false
  - name: SparseCheckoutPaths
    type: object
    default:
      - '**'
  - name: PackageSourceOverride
    type: string
    default: ''
  - name: DocValidationImageId
    type: string
    default: ''
steps:
  - ${{ if eq(length(parameters.PackageInfoLocations), 0) }}:
    - pwsh: |
        Write-Host "Skipping DocsMS Update because package list was empty."
      displayName: Skip DocsMS Update
  - ${{ else }}:
    - template: /eng/common/pipelines/templates/steps/enable-long-path-support.yml

    - pwsh: |
        Write-Host "###vso[task.setvariable variable=DocRepoLocation]${{ parameters.WorkingDirectory }}/doc"
      displayName: Set $(DocRepoLocation)

    - template: /eng/common/pipelines/templates/steps/sparse-checkout.yml
      parameters:
        SkipCheckoutNone: true
        Repositories:
          - Name: ${{ parameters.TargetDocRepoOwner }}/${{ parameters.TargetDocRepoName }}
            WorkingDirectory: $(DocRepoLocation)
        Paths: ${{ parameters.SparseCheckoutPaths }}

    # If performing a daily docs build set the $(TargetBranchName) to a daily branch
    # name and attempt to checkout the daily docs branch. If the branch doesn't
    # exist, create it
    - ${{ if eq(parameters.DailyDocsBuild, 'true') }}:
      - template: /eng/common/pipelines/templates/steps/set-daily-docs-branch-name.yml

      - pwsh: |
          $ErrorActionPreference = "Continue"
          $RemoteName = "origin"
          $BranchName = "$(TargetBranchName)"
          # Fetch and checkout remote branch if it already exists otherwise create a new branch.
          git ls-remote --exit-code --heads $RemoteName $BranchName
          if ($LASTEXITCODE -eq 0) {
            Write-Host "git fetch $RemoteName $BranchName"
            git fetch $RemoteName $BranchName
            Write-Host "git checkout $BranchName."
            git checkout $BranchName
          } else {
            Write-Host "git checkout -b $BranchName."
            git checkout -b $BranchName
          }
        displayName: Checkout daily docs branch if it exists
        workingDirectory: $(DocRepoLocation)

    # If NOT performing a daily docs build, set the $(TargetBranchName) to the
    # default branch of the documentation repository.
    - ${{ if ne(parameters.DailyDocsBuild, 'true') }}:
      - template: /eng/common/pipelines/templates/steps/set-default-branch.yml
        parameters:
          WorkingDirectory: $(DocRepoLocation)
          DefaultBranchVariableName: TargetBranchName
    # Pull and build the docker image.
    - ${{ if ne(parameters.DocValidationImageId, '') }}:
      - template: /eng/common/pipelines/templates/steps/docker-pull-image.yml
        parameters:
          ImageId: '${{ parameters.DocValidationImageId }}'
    - pwsh: |
        $packageInfoJson = '${{ convertToJson(parameters.PackageInfoLocations) }}'.Trim('"').Replace("\\", "/")
        # Without -NoEnumerate, a single element array[T] gets unwrapped as a single item T.
        $packageInfoLocations = ConvertFrom-Json $packageInfoJson -NoEnumerate
        ${{ parameters.ScriptDirectory }}/Update-DocsMsMetadata.ps1 `
          -PackageInfoJsonLocations $packageInfoLocations `
          -DocRepoLocation "$(DocRepoLocation)" `
          -Language '${{parameters.Language}}' `
          -RepoId '${{ parameters.RepoId }}' `
          -DocValidationImageId '${{ parameters.DocValidationImageId }}' `
          -PackageSourceOverride '${{ parameters.PackageSourceOverride }}'
      displayName: Apply Documentation Updates

    - template: /eng/common/pipelines/templates/steps/git-push-changes.yml
      parameters:
        BaseRepoBranch: $(TargetBranchName)
        BaseRepoOwner: ${{ parameters.TargetDocRepoOwner }}
        CommitMsg: "Update docs metadata"
        TargetRepoName: ${{ parameters.TargetDocRepoName }}
        TargetRepoOwner: ${{ parameters.TargetDocRepoOwner }}
        WorkingDirectory: $(DocRepoLocation)
        ScriptDirectory: ${{ parameters.WorkingDirectory }}/${{ parameters.ScriptDirectory }}
