name: "Windows Build"

# any branch is useful for testing before a PR is submitted
on: [push, pull_request]

permissions:
  contents: read

jobs:
  build-zip:
    # run on pushes to any branch
    # run on PRs from external forks
    if: |
      (github.event_name != 'pull_request')
      || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
    name: Build .zip
    runs-on: windows-latest
    steps:
      -
        uses: msys2/setup-msys2@v2
        with:
          path-type: inherit
          install: >-
            zip
      -
        name: Checkout repository
        uses: actions/checkout@v4
      -
        uses: actions/setup-node@v3
        with:
          node-version: 20
          cache: 'npm'
          cache-dependency-path: |
            src/package-lock.json
            src/bin/doc/package-lock.json
      -
        name: Install all dependencies and symlink for ep_etherpad-lite
        shell: msys2 {0}
        run: src/bin/installDeps.sh
      -
        name: Run the backend tests
        shell: msys2 {0}
        run: cd src && npm test
      -
        name: Build the .zip
        shell: msys2 {0}
        run: src/bin/buildForWindows.sh
      -
        name: Archive production artifacts
        uses: actions/upload-artifact@v3
        with:
          name: etherpad-win.zip
          path: etherpad-win.zip

  build-exe:
    if: |
      (github.event_name != 'pull_request')
      || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
    name: Build .exe
    needs: build-zip
    runs-on: windows-latest
    steps:
      -
        name: Checkout repository
        uses: actions/checkout@v4
      -
        name: Download .zip
        uses: actions/download-artifact@v3
        with:
          name: etherpad-win.zip
          path: ..
      -
        name: Extract .zip
        working-directory: ..
        run: 7z x etherpad-win.zip -oetherpad-zip
      -
        name: Create installer
        uses: joncloud/makensis-action@v3.7
        with:
          script-file: 'src/bin/nsis/etherpad.nsi'
      -
        name: Archive production artifacts
        uses: actions/upload-artifact@v3
        with:
          name: etherpad-win.exe
          path: etherpad-win.exe

  deploy-zip:
    # run on pushes to any branch
    # run on PRs from external forks
    permissions:
      contents: write
    if: |
      (github.event_name != 'pull_request')
      || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
    name: Deploy
    needs: build-zip
    runs-on: windows-latest
    steps:
      -
        name: Download zip
        uses: actions/download-artifact@v3
        with:
          name: etherpad-win.zip
      -
        name: Extract Etherpad
        run: 7z x etherpad-win.zip -oetherpad
      -
        uses: actions/setup-node@v3
        with:
          node-version: 20
          cache: 'npm'
          cache-dependency-path: |
            etherpad/src/package-lock.json
            etherpad/src/bin/doc/package-lock.json
      -
        name: Install Cypress
        run: cd etherpad && cd src && npm install cypress
      -
        name: Run Etherpad
        run: |
          cd etherpad
          node node_modules\ep_etherpad-lite\node\server.js &
          curl --connect-timeout 10 --max-time 20 --retry 5 --retry-delay 10 --retry-max-time 60 --retry-connrefused http://127.0.0.1:9001/p/test
          src\node_modules\cypress\bin\cypress run --config-file src\tests\frontendcypress\cypress.config.js
      # On release, upload windows zip to GitHub release tab
      -
        name: Rename to etherpad-lite-win.zip
        shell: powershell
        run: mv etherpad-win.zip etherpad-lite-win.zip
      - name: upload binaries to release
        uses: softprops/action-gh-release@v1
        if: ${{startsWith(github.ref, 'refs/tags/') }}
        with:
            files: etherpad-lite-win.zip
