name: Windows
on: 
  # push代码时触发workflow
  push:
    paths:
      - 'QtScrcpy/**'
      - '!QtScrcpy/res/**'
      - '.github/workflows/windows.yml'
  # pull_request时触发workflow
  pull_request:
    paths:
      - 'QtScrcpy/**'
      - '!QtScrcpy/res/**'
      - '.github/workflows/windows.yml'
jobs:
  build:
    name: Build
    # 运行平台， windows-latest目前是windows server 2019,选择2016是2016安装的是vs2017
    # https://github.com/actions/virtual-environments/blob/master/images/win/Windows2019-Readme.md
    # https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
    runs-on: windows-2016
    strategy:
      # 矩阵配置
      matrix:
        qt_ver: [5.12.6]
        qt_target: [desktop]
        # mingw用不了
        # qt_arch: [win64_msvc2017_64, win32_msvc2017, win32_mingw53,win32_mingw73]
        qt_arch: [win64_msvc2017_64, win32_msvc2017]
        # 额外设置msvc_arch
        include:
          - qt_arch: win64_msvc2017_64
            msvc_arch: x64
            qt_arch_install: msvc2017_64
          - qt_arch: win32_msvc2017
            msvc_arch: x86
            qt_arch_install: msvc2017
    env:
      targetName: QtScrcpy.exe
    # 步骤
    steps:
      - name: Cache Qt
        id: WindowsCacheQt
        uses: actions/cache@v1
        with:
          path: ../../Qt5/${{matrix.qt_ver}}/${{matrix.qt_arch_install}}
          key: ${{ runner.os }}-Qt5.12.6/${{matrix.qt_ver}}/${{matrix.qt_arch}}
      - name: Setup Qt
        if: steps.WindowsCacheQt.outputs.cache-hit == 'true'
        shell: pwsh
        env:
          QtPath: ../../Qt5/${{matrix.qt_ver}}/${{matrix.qt_arch_install}}
        run: |
          $qt_Path=${env:QtPath}
          echo "::set-env name=Qt5_Dir::$qt_Path"
          echo "::add-path::$qt_Path/bin"          
      # 安装Qt
      - name: Install Qt
        if: steps.WindowsCacheQt.outputs.cache-hit != 'true'
        # 使用外部action。这个action专门用来安装Qt
        uses: jurplel/install-qt-action@v2.0.0
        with:
          # Version of Qt to install
          version: ${{ matrix.qt_ver }}
          # Target platform for build
          target: ${{ matrix.qt_target }}
          # Architecture for Windows/Android
          arch: ${{ matrix.qt_arch }}
      # 拉取代码
      - uses: actions/checkout@v1
        with:
          fetch-depth: 1
      # 编译msvc
      - name: Build MSVC
        shell: cmd
        env:
          ENV_VCVARSALL: 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat'
          ENV_QT_PATH: 'd:\a\Qt5\5.12.6'
        run: |
          call "ci\win\build_for_win.bat" release ${{ matrix.msvc_arch }}
      # tag 打包
      - name: Package
        if: startsWith(github.event.ref, 'refs/tags/')
        env:
          publish_dir: QtScrcpy-win-${{matrix.msvc_arch}}
          ref: ${{ github.event.ref }}
        shell: pwsh
        run: |
          [string]$tag = ${env:ref}.Substring(${env:ref}.LastIndexOf('/') + 1)
          [string]$full_publish_dir = ${env:publish_dir} + '-' + ${tag}
          cmd.exe /c ci\win\publish_for_win.bat ${{matrix.msvc_arch}} ..\build\$full_publish_dir
          # 打包zip
          Compress-Archive -Path ci\build\$full_publish_dir ci\build\${full_publish_dir}.zip
          # 记录环境变量packageName给后续step
          $name = $full_publish_dir
          echo "::set-env name=packageName::$name"
          # 打印环境变量packageName
          Write-Host 'packageName:'${env:packageName}
      # 查询Release
      - name: Query Release
        if: startsWith(github.event.ref, 'refs/tags/')
        shell: pwsh
        env:
          githubFullName: ${{ github.event.repository.full_name }}
          ref: ${{ github.event.ref }}
        run: |
          [string]$tag = ${env:ref}.Substring(${env:ref}.LastIndexOf('/') + 1)
          [string]$url = 'https://api.github.com/repos/' + ${env:githubFullName} + '/releases/tags/' + ${tag}
          $response={}
          try {
            $response = Invoke-RestMethod -Uri $url -Method Get
          } catch {
            Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ 
            Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
            # 没查到
            return 1
          }
          [string]$latestUpUrl = $response.upload_url
          Write-Host 'latestUpUrl:'$latestUpUrl
          if ($latestUpUrl.Length -eq 0) {
            # 没查到
            return 1
          }
      # 获取上传url
      - name: Get Release Url
        if: startsWith(github.event.ref, 'refs/tags/')
        shell: pwsh
        env:
          githubFullName: ${{ github.event.repository.full_name }}
          ref: ${{ github.event.ref }}
          github_token: ${{ secrets.GITHUB_TOKEN }}
        run: |
          [string]$tag = ${env:ref}.Substring(${env:ref}.LastIndexOf('/') + 1)
          [string]$url = 'https://api.github.com/repos/' + ${env:githubFullName} + '/releases/tags/' + ${tag}
          # github token防止api rate limite，否则一个小时只能60个api请求
          $token = ${env:github_token}
          $authInfo = ("{0}" -f $token)
          $authInfo = [System.Text.Encoding]::UTF8.GetBytes($authInfo)
          $authInfo = [System.Convert]::ToBase64String($authInfo)
          $headers = @{Authorization=("barry-ran {0}" -f $authInfo)}
          $response = Invoke-RestMethod -Uri $url -ContentType 'text/json' -Headers $headers -Method Get
          [string]$latestUpUrl = $response.upload_url
          Write-Host 'latestUpUrl:'$latestUpUrl
          echo "::set-env name=uploadUrl::$latestUpUrl"
          Write-Host 'env uploadUrl:'${env:uploadUrl}
      # tag 上传Release
      - name: Upload Release
        id: uploadRelease
        if: startsWith(github.event.ref, 'refs/tags/')
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        uses: actions/upload-release-asset@v1.0.1
        with:
          upload_url: ${{ env.uploadUrl }}
          asset_path: ci\build\${{ env.packageName }}.zip
          asset_name: ${{ env.packageName }}.zip
          asset_content_type: application/zip