name: Build Docker Image - Latest

on:
  workflow_dispatch:

env:
  REGISTRY: docker.lechner-systems.at
  IMAGE_NAME: lechnersystems/portfolio

jobs:
  docker:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Use Node.js v24.14.0
        uses: actions/setup-node@v4
        with:
          node-version: '24.14.0'

      - name: Set build version
        run: npm run version:set

      - name: Read version from package.json
        id: version
        run: |
          version=$(node -p 'require("./package.json").version')
          docker_tag=${version//+/-}
          echo "value=$version" >> "$GITHUB_OUTPUT"
          echo "docker_tag=$docker_tag" >> "$GITHUB_OUTPUT"

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.DOCKER_REGISTRY_USERNAME }}
          password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}

      - name: Build and push latest image
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          provenance: false
          build-args: |
            APP_VERSION=${{ steps.version.outputs.value }}
          tags: |
            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.docker_tag }}
          labels: |
            org.opencontainers.image.version=${{ steps.version.outputs.value }}
            org.opencontainers.image.revision=${{ github.sha }}
            org.opencontainers.image.source=https://github.com/${{ github.repository }}

      - name: Create GitHub release
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          RELEASE_TAG: v${{ steps.version.outputs.docker_tag }}
        run: |
          previous_tag="$(gh api repos/${{ github.repository }}/releases --paginate --jq '.[] | select(.draft == false) | .tag_name' | grep -Fxv "$RELEASE_TAG" | head -n 1 || true)"

          if [ -n "$previous_tag" ]; then
              commit_messages="$(git log --reverse --format='- %s' "${previous_tag}..${GITHUB_SHA}")"
              full_changelog="https://github.com/${{ github.repository }}/compare/${previous_tag}...${RELEASE_TAG}"
          else
              commit_messages="$(git log --reverse --format='- %s' "${GITHUB_SHA}")"
              full_changelog=""
          fi

          if [ -z "$commit_messages" ]; then
              commit_messages='- No commits since the previous release'
          fi

          {
              echo '## Changes'
              echo
              printf '%s\n' "$commit_messages"
              echo
              if [ -n "$full_changelog" ]; then
                  echo "**Full Changelog**: ${full_changelog}"
              fi
          } > release-notes.md

          if gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
              gh release edit "$RELEASE_TAG" --title "$RELEASE_TAG" --notes-file release-notes.md
          else
              gh release create "$RELEASE_TAG" --target "${GITHUB_SHA}" --title "$RELEASE_TAG" --notes-file release-notes.md
          fi
