name: Emu build (Windows)

on:
  push:
    branches: [ 
      "ci-build-emu-win*",
      "ci-build-all"
    ]
    tags:        
      - release*
  pull_request:
    branches: [ "dev" ]
  workflow_dispatch:
    # allows manual trigger

permissions:
  contents: write

env:
  DEPS_CACHE_KEY: emu-deps-win
  DEPS_CACHE_DIR: build/deps/win
  
  PACKAGE_BASE_DIR: "build/package/win"
  THIRD_PARTY_BASE_DIR: 'third-party'

jobs:
  # this helps in manual runs, if build fails, then deps are saved
  dependencies:
    runs-on: windows-2022
    # cache but not for tags or PRs
    # !tag && !pull_request
    # also you could use this: github.event_name != 'pull_request'
    if: |
      !startsWith(github.ref, 'refs/tags/') &&
      !startsWith(github.ref, 'refs/pull/')

    steps:
    # we need branch because it has build scripts
    - name: Checkout branch
      uses: actions/checkout@v4

    - name: Lookup cache for deps
      id: emu-deps-cache-step
      uses: actions/cache@v3
      with:
        key: ${{ env.DEPS_CACHE_KEY }}
        path: ${{ env.DEPS_CACHE_DIR }}
        lookup-only: true # don't restore cache if found

    - name: Clone third-party deps (deps/win)
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      uses: actions/checkout@v4
      with:
        ref: 'third-party/deps/win'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/deps/win"

    - name: Clone third-party deps (deps/common)
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      uses: actions/checkout@v4
      with:
        ref: 'third-party/deps/common'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/deps/common"

    - name: Clone third-party deps (common/win)
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      uses: actions/checkout@v4
      with:
        ref: 'third-party/common/win'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/common/win"

    - name: Build deps
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      shell: cmd
      working-directory: ${{ github.workspace }}
      run: build_win_deps.bat -verbose


  build:
    runs-on: windows-2022
    needs: [ dependencies ]
    if: ${{ !cancelled() }}

    steps:
    - name: Checkout branch
      uses: actions/checkout@v4

### deps
    - name: Lookup cache for deps
      id: emu-deps-cache-step
      # !tag && !pull_request
      # also you could use this: github.event_name != 'pull_request'
      if: |
        !startsWith(github.ref, 'refs/tags/') &&
        !startsWith(github.ref, 'refs/pull/')
      uses: actions/cache@v3
      with:
        key: ${{ env.DEPS_CACHE_KEY }}
        path: ${{ env.DEPS_CACHE_DIR }}

    # attempt to download again because in tags/PRs no cache is created
    - name: Clone third-party deps (deps/win)
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      uses: actions/checkout@v4
      with:
        ref: 'third-party/deps/win'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/deps/win"

    - name: Clone third-party deps (deps/common)
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      uses: actions/checkout@v4
      with:
        ref: 'third-party/deps/common'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/deps/common"

    - name: Clone third-party deps (common/win)
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      uses: actions/checkout@v4
      with:
        ref: 'third-party/common/win'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/common/win"

    - name: Build deps
      if: steps.emu-deps-cache-step.outputs.cache-hit != 'true'
      shell: cmd
      working-directory: ${{ github.workspace }}
      run: build_win_deps.bat -verbose

## extra helpers/tools, these are not built inside the deps build dir
    - name: Clone third-party build helpers (common/win)
      uses: actions/checkout@v4
      with:
        ref: 'third-party/common/win'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/common/win"

    - name: Clone third-party deps (deps/win)
      uses: actions/checkout@v4
      with:
        ref: 'third-party/deps/win'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/deps/win"

    - name: Clone third-party deps (build/win)
      uses: actions/checkout@v4
      with:
        ref: 'third-party/build/win'
        path: "${{env.THIRD_PARTY_BASE_DIR}}/build/win"

### build (release mode)
    - name: Build release mode
      shell: cmd
      working-directory: ${{ github.workspace }}
      run: build_win.bat -verbose +exclient-extra-32 +exclient-extra-64 release

### package (release mode)
    - name: Package build (release)
      shell: cmd
      working-directory: ${{ github.workspace }}
      run: package_win.bat release

### upload artifact/package to github Actions (release mode)
    - name: Upload build package (release)
      uses: actions/upload-artifact@v4
      with:
        name: "build-win-release-${{ github.sha }}"
        path: "${{ env.PACKAGE_BASE_DIR }}/release/"
        if-no-files-found: 'error'
        compression-level: 9
        retention-days: 1
    
### build (debug mode)
    - name: Build debug mode
      shell: cmd
      working-directory: ${{ github.workspace }}
      run: build_win.bat -verbose +exclient-extra-32 +exclient-extra-64 debug

### package (debug mode)
    - name: Package build (debug)
      shell: cmd
      working-directory: ${{ github.workspace }}
      run: package_win.bat debug

### upload artifact/package to github Actions (debug mode)
    - name: Upload build package (debug)
      uses: actions/upload-artifact@v4
      with:
        name: "build-win-debug-${{ github.sha }}"
        path: "${{ env.PACKAGE_BASE_DIR }}/debug/"
        if-no-files-found: 'error'
        compression-level: 9
        retention-days: 1
    
### release (debug + release modes) if this is a tag push
    - name: Release
      if: startsWith(github.ref, 'refs/tags/')
      uses: softprops/action-gh-release@v1
      with:
        files: "${{ env.PACKAGE_BASE_DIR }}/**/*"
    