on:
  push:
    branches:
      - main

defaults:
  run:
    shell: bash

jobs:
  library_release:
    runs-on: docker
    container:
      image: registry.garrity.co:8443/gs/ci-scala:latest
    name: 'Build and Release Library'
    env:
      GS_MAVEN_USER: ${{ vars.GS_MAVEN_USER }}
      GS_MAVEN_TOKEN: ${{ secrets.GS_MAVEN_TOKEN }}
    steps:
      - uses: actions/checkout@v4
        name: 'Checkout Repository'
        with:
          fetch-depth: 0
      - name: 'Pre-Commit'
        run: |
          pre-commit install
          pre-commit run --all-files
      - name: 'Prepare Versioned Build'
        run: |
          latest_git_tag="$(git describe --tags --abbrev=0 || echo 'No Tags')"
          latest_commit_message="$(git show -s --format=%s HEAD)"
          if [[ "$latest_commit_message" == *"(major)"* ]]; then
              export GS_RELEASE_TYPE="major"
          elif [[ "$latest_commit_message" == *"(minor)"* ]]; then
              export GS_RELEASE_TYPE="minor"
          elif [[ "$latest_commit_message" == *"(patch)"* ]]; then
              export GS_RELEASE_TYPE="patch"
          elif [[ "$latest_commit_message" == *"(docs)"* ]]; then
              export GS_RELEASE_TYPE="norelease"
          elif [[ "$latest_commit_message" == *"(norelease)"* ]]; then
              export GS_RELEASE_TYPE="norelease"
          else
              export GS_RELEASE_TYPE="norelease"
          fi

          echo "GS_RELEASE_TYPE=$GS_RELEASE_TYPE" >> $GITHUB_ENV
          echo "Previous Git Tag: $latest_git_tag"
          echo "Latest Commit: $latest_commit_message"
          echo "Selected Release Type: '$GS_RELEASE_TYPE'"

          if [ "$GS_RELEASE_TYPE" = "norelease" ]; then
            echo "Skipping all versioning for 'norelease' commit."
          else
            sbtn -Drelease="$GS_RELEASE_TYPE" semVerInfo
          fi
      - name: 'Unit Tests and Code Coverage'
        run: |
          if [ "${{ env.GS_RELEASE_TYPE }}" = "norelease" ]; then
            echo "Skipping build/test for 'norelease' commit."
          else
            sbtn clean
            sbtn 'set coverageEnabled := true'
            sbtn test
            sbtn coverageReport
          fi
      - name: 'Publish Release'
        run: |
          if [ "${{ env.GS_RELEASE_TYPE }}" = "norelease" ]; then
            echo "Skipping publish for 'norelease' commit."
          else
            sbtn clean
            sbtn coverageOff
            sbtn semVerWriteVersionToFile
            sbtn publish
          fi
      - name: 'Create Git Tag'
        run: |
          if [ "${{ env.GS_RELEASE_TYPE }}" = "norelease" ]; then
            echo "Skipping Git tag for 'norelease' commit."
          else
            selected_version="$(cat .version)"
            git tag "$selected_version"
            git push origin "$selected_version"
          fi