name: Build and Publish Unified Docker Image

on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  test:
    name: Run Tests
    uses: ./.github/workflows/run-tests.yml
    secrets:
      WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}

  build-and-push:
    needs: test
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

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

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

      - name: Log in to GitHub Container Registry
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels)
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=sha,prefix=sha-
            type=raw,value=latest,enable={{is_default_branch}}
          labels: |
            org.opencontainers.image.title=ReadMeABook Unified
            org.opencontainers.image.description=All-in-one audiobook request and automation system (PostgreSQL + Redis + App)
            org.opencontainers.image.vendor=ReadMeABook

      - name: Capture version information
        id: version
        run: |
          echo "app_version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT
          echo "git_commit=$(git rev-parse --short=7 HEAD)" >> $GITHUB_OUTPUT
          echo "build_date=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_OUTPUT

      - name: Build and push unified Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./dockerfile.unified
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          build-args: |
            APP_VERSION=${{ steps.version.outputs.app_version }}
            GIT_COMMIT=${{ steps.version.outputs.git_commit }}
            BUILD_DATE=${{ steps.version.outputs.build_date }}

      - name: Generate deployment instructions
        if: github.event_name != 'pull_request'
        run: |
          echo "## 🎉 Docker image published successfully!" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "### 📦 Available tags:" >> $GITHUB_STEP_SUMMARY
          echo '```' >> $GITHUB_STEP_SUMMARY
          echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
          echo '```' >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "### 🚀 Quick start:" >> $GITHUB_STEP_SUMMARY
          echo '```bash' >> $GITHUB_STEP_SUMMARY
          echo "docker run -d \\" >> $GITHUB_STEP_SUMMARY
          echo "  --name readmeabook \\" >> $GITHUB_STEP_SUMMARY
          echo "  -p 3030:3030 \\" >> $GITHUB_STEP_SUMMARY
          echo "  -v ./config:/app/config \\" >> $GITHUB_STEP_SUMMARY
          echo "  -v ./downloads:/downloads \\" >> $GITHUB_STEP_SUMMARY
          echo "  -v ./media:/media \\" >> $GITHUB_STEP_SUMMARY
          echo "  -v readmeabook-data:/var/lib/postgresql/data \\" >> $GITHUB_STEP_SUMMARY
          echo "  ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY
          echo '```' >> $GITHUB_STEP_SUMMARY

      - name: Send Discord notification
        if: github.event_name != 'pull_request' && success()
        run: |
          curl -H "Content-Type: application/json" \
            -X POST \
            -d '{
              "embeds": [{
                "title": "📦 Docker Image Published",
                "description": "**ReadMeABook v${{ steps.version.outputs.app_version }}** has been built and published to GitHub Container Registry.",
                "color": 5763719,
                "fields": [
                  {
                    "name": "🔖 Version",
                    "value": "`v${{ steps.version.outputs.app_version }}`",
                    "inline": true
                  },
                  {
                    "name": "🌿 Branch",
                    "value": "`${{ github.ref_name }}`",
                    "inline": true
                  },
                  {
                    "name": "📋 Commit",
                    "value": "[`${{ steps.version.outputs.git_commit }}`](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }})",
                    "inline": true
                  },
                  {
                    "name": "📥 Pull Command",
                    "value": "```docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest```",
                    "inline": false
                  }
                ],
                "footer": {
                  "text": "ReadMeABook v${{ steps.version.outputs.app_version }} • Built with GitHub Actions"
                },
                "timestamp": "${{ steps.version.outputs.build_date }}"
              }]
            }' \
            ${{ secrets.WEBHOOK_URL }}
