name: release

on:
  push:
    tags:
      - 'v*.*.*'  # Triggert auf Semantic Versioning Tags (v1.0.0, v2.1.3, etc.)

permissions:
  contents: write
  packages: write

jobs:
  release:
    runs-on: ubuntu-22.04

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0

      - name: Load versions from .env.versions
        id: versions
        run: |
          set -a
          source .env.versions
          set +a

          echo "node_version=${NODE_VERSION}" >> "$GITHUB_OUTPUT"
          echo "go_version=${GO_VERSION}" >> "$GITHUB_OUTPUT"
          echo "hugo_version=${HUGO_VERSION}" >> "$GITHUB_OUTPUT"

          echo "Node: ${NODE_VERSION}"
          echo "Go: ${GO_VERSION}"
          echo "Hugo: ${HUGO_VERSION}"

      - name: Extract version from tag
        id: version
        run: |
          VERSION=${GITHUB_REF#refs/tags/v}
          echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
          echo "Version: ${VERSION}"

      - name: Repository meta
        id: repository
        run: |
          registry=${{ github.server_url }}
          registry=${registry##http*://}
          echo "registry=${registry}" >> "$GITHUB_OUTPUT"
          echo "registry=${registry}"
          repository="$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')"
          echo "repository=${repository}" >> "$GITHUB_OUTPUT"
          echo "repository=${repository}"

      - name: Docker meta
        uses: docker/metadata-action@v5
        id: docker
        with:
          images: ${{ steps.repository.outputs.registry }}/${{ steps.repository.outputs.repository }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=raw,value=latest

      - name: Login to registry
        uses: docker/login-action@v3
        with:
          registry: ${{ steps.repository.outputs.registry }}
          username: "${{ secrets.PACKAGES_USER }}"
          password: "${{ secrets.PACKAGES_TOKEN }}"

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-flags: '--allow-insecure-entitlement network.host'
          driver-opts: network=host

      - name: Build and push release images
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          allow: network.host
          network: host
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.docker.outputs.tags }}
          labels: ${{ steps.docker.outputs.labels }}
          build-args: |
            NODE_VERSION=${{ steps.versions.outputs.node_version }}
            GO_VERSION=${{ steps.versions.outputs.go_version }}
            HUGO_VERSION=${{ steps.versions.outputs.hugo_version }}

      - name: Generate changelog
        id: changelog
        run: |
          # Finde vorheriges Tag
          PREVIOUS_TAG=$(git describe --abbrev=0 --tags ${GITHUB_REF}^ 2>/dev/null || echo "")

          if [ -z "$PREVIOUS_TAG" ]; then
            echo "Erster Release - Changelog von Anfang an"
            CHANGELOG=$(git log --pretty=format:"- %s (%h)" --no-merges)
          else
            echo "Changelog seit ${PREVIOUS_TAG}"
            CHANGELOG=$(git log ${PREVIOUS_TAG}..${GITHUB_REF} --pretty=format:"- %s (%h)" --no-merges)
          fi

          # Schreibe in Output-Datei (multiline)
          {
            echo 'changelog<<EOF'
            echo "$CHANGELOG"
            echo 'EOF'
          } >> "$GITHUB_OUTPUT"

      - name: Create Forgejo/Gitea Release
        uses: actions/forgejo-release@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          direction: upload
          release-dir: .
          title: "Release ${{ steps.version.outputs.version }}"
          tag: ${{ github.ref_name }}
          token: ${{ secrets.GITHUB_TOKEN }}
          release-notes: |
            # Release ${{ steps.version.outputs.version }}

            ## Docker Images

            Multi-platform images (linux/amd64, linux/arm64) sind verfügbar:

            ```bash
            docker pull ${{ steps.repository.outputs.registry }}/${{ steps.repository.outputs.repository }}:${{ steps.version.outputs.version }}
            docker pull ${{ steps.repository.outputs.registry }}/${{ steps.repository.outputs.repository }}:latest
            ```

            ## Build Versions

            - Node.js: ${{ steps.versions.outputs.node_version }}
            - Go: ${{ steps.versions.outputs.go_version }}
            - Hugo: ${{ steps.versions.outputs.hugo_version }}

            ## Changes

            ${{ steps.changelog.outputs.changelog }}
