name: release

# Builds and pushes the minstrel container image to the Forgejo registry.
#
#   push to main         → :main
#   push tag vX.Y.Z      → :vX.Y.Z and :latest
#   workflow_dispatch    → manual trigger (same rules based on the ref)

on:
  push:
    branches: [main]
    tags: ['v*']
    # Tag pushes still build (tag releases are intentional, server + Flutter
    # share the version). Branch pushes skip when the diff is Flutter-only —
    # rebuilding the Go image for a Flutter-only merge wastes CI and churns
    # the registry.
    paths-ignore:
      - 'flutter_client/**'
      - 'docs/**'
      - '**/*.md'
  workflow_dispatch:

jobs:
  release:
    runs-on: go-ci

    env:
      IMAGE: git.fabledsword.com/bvandeusen/minstrel

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

      - name: Detect buildable project
        id: guard
        shell: bash
        run: |
          if [ -f Dockerfile ] && [ -f go.mod ]; then
            echo "ready=true" >> "$GITHUB_OUTPUT"
          else
            echo "ready=false" >> "$GITHUB_OUTPUT"
            echo "::notice::No Dockerfile + go.mod yet — release build skipped"
          fi

      - name: Compute image tags
        id: tags
        if: steps.guard.outputs.ready == 'true'
        shell: bash
        run: |
          if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then
            VERSION="${GITHUB_REF#refs/tags/}"
            echo "args=-t ${IMAGE}:${VERSION} -t ${IMAGE}:latest" >> "$GITHUB_OUTPUT"
            echo "::notice::Release build: ${VERSION} + latest"
          else
            echo "args=-t ${IMAGE}:main" >> "$GITHUB_OUTPUT"
            echo "::notice::Main-branch build: :main"
          fi

      - name: Registry login
        if: steps.guard.outputs.ready == 'true'
        shell: bash
        run: |
          echo "${{ secrets.REGISTRY_TOKEN }}" \
            | docker login git.fabledsword.com -u "${{ github.actor }}" --password-stdin

      - name: Build and push
        if: steps.guard.outputs.ready == 'true'
        run: docker buildx build --push ${{ steps.tags.outputs.args }} .
