name: Build and Deploy
on:
  push:
    branches:
      - main
    tags:
      - 'v[0-9]+.*'
  pull_request:
    branches:
      - main
      - 'feat/*'
env:
  MAVEN_OPTS: "-Xmx4G -Dhttps.protocols=TLSv1.2 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"

jobs:
  test-linux:
    if: ${{ !(github.ref == 'refs/heads/main' && contains(github.event.head_commit.message, '[maven-release-plugin]')) }}
    runs-on: buildjet-4vcpu-ubuntu-2204
    steps: 
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: 11
          distribution: 'temurin'
          cache: 'maven'

      - name: Run Tests
        run: mvn -B -Drascal.compile.skip -Drascal.tutor.skip -Drascal.test.memory=14 test

      - uses: codecov/codecov-action@v4
        continue-on-error: true # sometimes this one fails, that shouldn't stop a build
        with:
          fail_ci_if_error: false
          verbose: true
          token: ${{ secrets.CODECOV_TOKEN }}

      - name: Publish Test Report on github action
        if: ${{ always() && github.event_name != 'pull_request' }} # to bad this doesn't work nicely with external pull requests
        continue-on-error: true # sometimes this one fails, that shouldn't stop a build
        uses: scacap/action-surefire-report@v1
        with:
          check_name: "Test Report - ${{ runner.os }}"

  builds:
    if: ${{ !(github.ref == 'refs/heads/main' && contains(github.event.head_commit.message, '[maven-release-plugin]')) }}
    needs: [test-linux]
    permissions:
      contents: write
    runs-on: buildjet-4vcpu-ubuntu-2204
    steps:
      - uses: browser-actions/setup-chrome@latest
        with:
          chrome-version: 1047731 # v107
      - run: which chrome
      - uses: nanasess/setup-chromedriver@v2
        with:
          chromedriver-version: '107.0.5304.62'
      - run: which chromedriver
      
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: 11
          distribution: 'temurin'
          cache: 'maven'

      - name: Compile & Bootstrap
        run: mvn -B compile -Dwebdriver.chrome.driver=/usr/local/bin/chromedriver -Dwebdriver.chrome.browser=`which chrome` 
        env:
          MAVEN_OPTS: "-Xmx14G -Dhttps.protocols=TLSv1.2 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"

      - name: Test if release # just to be extra sure for a release
        if: startsWith(github.ref, 'refs/tags/v')
        run: mvn -Drascal.test.memory=10 -Drascal.compile.skip -Drascal.tutor.skip test 

      - name: Attach artifact 
        id: build-artifact
        uses: SWAT-engineering/maven-full-artifacts-action@v1
        with:
          maven-options: |
            -Drascal.compile.skip
            -Drascal.tutor.skip
            -DskipTests

      - name: Making sure test have succeeded in the parallel jobs
        if: startsWith(github.ref, 'refs/tags/')
        uses: yogeshlonkar/wait-for-jobs@v0
        with:
          gh-token: ${{ secrets.GITHUB_TOKEN }}
          jobs: |
            tests (macos-latest)
            tests (windows-latest)
            tests (buildjet-4vcpu-ubuntu-2204-arm)
          ttl: 15

      - name: Deploy shaded jar
        if: startsWith(github.ref, 'refs/tags/v')
        uses: usethesource/releases-maven-action@v1
        with:
          maven-username: ${{ secrets.RELEASE_MAVEN_USERNAME }}
          maven-password: ${{ secrets.RELEASE_MAVEN_PASSWORD }}
          maven-local-port: ${{ secrets.RELEASE_MAVEN_LOCAL_PORT }}
          ssh-hostname: ${{ secrets.RELEASE_SSH_SERVER }}
          ssh-known-host: ${{ secrets.RELEASE_SSH_KNOWN_HOSTS }}
          ssh-username: ${{ secrets.RELEASE_SSH_USERNAME }}
          ssh-private-key: ${{ secrets.RELEASE_SSH_PRIVATE_KEY }}

      - name: Deploy unshaded jar
        if: startsWith(github.ref, 'refs/tags/v')
        uses: usethesource/releases-maven-action@v1
        with:
          maven-username: ${{ secrets.RELEASE_MAVEN_USERNAME }}
          maven-password: ${{ secrets.RELEASE_MAVEN_PASSWORD }}
          maven-local-port: ${{ secrets.RELEASE_MAVEN_LOCAL_PORT }}
          ssh-hostname: ${{ secrets.RELEASE_SSH_SERVER }}
          ssh-known-host: ${{ secrets.RELEASE_SSH_KNOWN_HOSTS }}
          ssh-username: ${{ secrets.RELEASE_SSH_USERNAME }}
          ssh-private-key: ${{ secrets.RELEASE_SSH_PRIVATE_KEY }}
          maven-options: -Punshaded

      - name: Prepare Draft Release
        uses: softprops/action-gh-release@v2
        if: startsWith(github.ref, 'refs/tags/')
        with:
          draft: true
          files: ${{ steps.build-artifact.outputs.artifact-root-dir}}/**/*
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


  tests:
    if: ${{ !(github.ref == 'refs/heads/main' && contains(github.event.head_commit.message, '[maven-release-plugin]')) }}
    needs: [test-linux]
    runs-on: ${{matrix.os}}
    strategy:
      matrix:
        os: [windows-latest, macos-latest, buildjet-4vcpu-ubuntu-2204-arm]
    env:
      MAVEN_OPTS: "-Xmx1G -Dhttps.protocols=TLSv1.2 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
    steps: 
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: 11
          distribution: 'temurin'
          cache: 'maven'

      - name: Run Tests
        # single quotes to help windows deal with argument splitting
        run: mvn -B '-Drascal.compile.skip' '-Drascal.tutor.skip' '-Drascal.test.memory=3' test

      - uses: codecov/codecov-action@v4
        continue-on-error: true # sometimes this one fails, that shouldn't stop a build
        with:
          token: e8b4481a-d178-4148-a4ff-502906390512

      - name: Publish Test Report on github action
        if: ${{ always() && github.event_name != 'pull_request' }} # to bad this doesn't work nicely with external pull requests
        continue-on-error: true # sometimes this one fails, that shouldn't stop a build
        uses: scacap/action-surefire-report@v1
        with:
          check_name: "Test Report - ${{ runner.os }}"

