name: Create docker images

on:
  push:
    tags:
      - 'v*.*.*'
  workflow_dispatch:
    inputs:
      version:
        description: 'Optional image version (e.g. 3.0.0, v3.0.0, or 3.0.0-beta.1)'
        required: false
        default: ''

jobs:
  build:
    name: Build, push, and deploy
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - uses: actions/checkout@v5

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

      - name: Log into GHCR
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Log into Docker Hub
        if: github.repository == 'umami-software/umami'
        uses: docker/login-action@v3
        with:
          registry: docker.io
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Compute version tags
        id: compute
        run: |
          INPUT="${{ github.event.inputs.version }}"
          REF_TYPE="${{ github.ref_type }}"
          REF_NAME="${{ github.ref_name }}"

          # Determine version source
          if [[ -n "$INPUT" ]]; then
            VERSION="${INPUT#v}"
          elif [[ "$REF_TYPE" == "tag" ]]; then
            VERSION="${REF_NAME#v}"
          else
            VERSION=""
          fi

          TAGS=""

          if [[ -n "$VERSION" ]]; then
            MAJOR=$(echo "$VERSION" | cut -d. -f1)
            MINOR=$(echo "$VERSION" | cut -d. -f2)

            if [[ "$VERSION" == *-* ]]; then
              # prerelease: only version tag
              TAGS="$VERSION"
            else
              # stable release: version + hierarchy + latest
              TAGS="$VERSION,${MAJOR}.${MINOR},${MAJOR},postgresql-latest,latest"
            fi
          else
            # Non-tag build (e.g. from main branch)
            TAGS="${REF_NAME}"
          fi

          echo "tags=$TAGS" >> $GITHUB_OUTPUT
          echo "Computed tags: $TAGS"

      - name: Build and push Docker image
        run: |
          TAGS="${{ steps.compute.outputs.tags }}"

          # Set image targets conditionally
          if [[ "${{ github.repository }}" == "umami-software/umami" ]]; then
            IMAGES=("umamisoftware/umami" "ghcr.io/${{ github.repository }}")
          else
            IMAGES=("ghcr.io/${{ github.repository }}")
          fi

          for IMAGE in "${IMAGES[@]}"; do
            echo "Building and pushing $IMAGE with tags: $TAGS"
            docker buildx build \
              --platform linux/amd64,linux/arm64 \
              --push \
              $(echo "$TAGS" | tr ',' '\n' | sed "s|^|--tag ${IMAGE}:|") \
              --cache-from type=gha \
              --cache-to type=gha,mode=max \
              .
          done
