name: Build & deploy

# Appelle le workflow RÉUTILISABLE LOCAL (copie vendorisée du framework WP Reactor)
# — un reusable workflow d'un repo privé d'une autre org n'est pas accessible
# cross-org. Voir .github/workflows/build-and-deploy-image.yml
#
# Environnements GitHub : main -> production, development -> staging.
# Secrets (NODE_AUTH_TOKEN, COOLIFY_*) et variables (VITE_*) sont lus au niveau
# de l'environnement, avec repli automatique sur le niveau repo.
on:
  push:
    branches: [main, development]
  workflow_dispatch:

jobs:
  # Quelles images faut-il vraiment reconstruire ?
  #
  # WordPress tourne en ressource Compose : Coolify n'y fait pas de rolling
  # update (conteneur stateful sur un volume partagé), donc chaque redéploiement
  # coupe l'admin et /graphql une dizaine de secondes. Reconstruire les DEUX
  # images à chaque push infligeait ce blip pour un simple restyle du front —
  # alors que le front rend les blocs depuis apps/webapp, le thème enfant ne
  # servant que l'éditeur.
  #
  # On ne filtre donc pas pour économiser des minutes de CI, mais pour ne plus
  # redémarrer WordPress quand rien de WordPress n'a bougé.
  changes:
    runs-on: ubuntu-latest
    outputs:
      webapp: ${{ steps.filter.outputs.webapp }}
      wordpress: ${{ steps.filter.outputs.wordpress }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - id: filter
        env:
          BEFORE: ${{ github.event.before }}
          AFTER: ${{ github.sha }}
          EVENT: ${{ github.event_name }}
        run: |
          set -euo pipefail

          # Tout reconstruire quand la base de comparaison est inconnue : premier
          # push sur un repo neuf (BEFORE = 000…0), workflow_dispatch, ou commit
          # de base absent (force push, historique réécrit). En cas de doute on
          # déploie tout — sauter un déploiement nécessaire coûte plus cher qu'un
          # blip évitable.
          if [ "$EVENT" != "push" ] \
            || [ -z "${BEFORE:-}" ] \
            || [ "$BEFORE" = "0000000000000000000000000000000000000000" ] \
            || ! git cat-file -e "${BEFORE}^{commit}" 2>/dev/null; then
            echo "Base inconnue ($EVENT) — reconstruction des deux images."
            echo "webapp=true"    >> "$GITHUB_OUTPUT"
            echo "wordpress=true" >> "$GITHUB_OUTPUT"
            exit 0
          fi

          CHANGED=$(git diff --name-only "$BEFORE" "$AFTER")
          echo "Fichiers modifiés :"; echo "$CHANGED"

          # Racine du workspace et CI : les deux images installent le monorepo
          # entier, donc tout changement ici les concerne toutes les deux.
          SHARED='^(package\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|turbo\.json|\.github/workflows/)'

          match() { echo "$CHANGED" | grep -Eq "$1"; }

          if match "$SHARED" || match '^(apps/webapp/|pages/)'; then
            echo "webapp=true" >> "$GITHUB_OUTPUT"
          else
            echo "webapp=false" >> "$GITHUB_OUTPUT"
          fi

          if match "$SHARED" || match '^apps/wordpress/'; then
            echo "wordpress=true" >> "$GITHUB_OUTPUT"
          else
            echo "wordpress=false" >> "$GITHUB_OUTPUT"
          fi

  # Seul job autorisé à porter `environment:` — un job qui appelle un workflow
  # réutilisable ne le peut pas. Il résout donc les `vars` de l'environnement.
  config:
    runs-on: ubuntu-latest
    environment: ${{ github.ref_name == 'main' && 'production' || 'staging' }}
    outputs:
      environment: ${{ github.ref_name == 'main' && 'production' || 'staging' }}
      webapp-build-args: |
        VITE_WORDPRESS_URL=${{ vars.VITE_WORDPRESS_URL }}
        VITE_FRONTEND_URL=${{ vars.VITE_FRONTEND_URL }}
        VITE_GRAPHQL_PATH=${{ vars.VITE_GRAPHQL_PATH }}
        VITE_FEATURE_EDITORIAL=${{ vars.VITE_FEATURE_EDITORIAL }}
        VITE_FEATURE_ECOMMERCE=${{ vars.VITE_FEATURE_ECOMMERCE }}
        VITE_FEATURE_AUTH=${{ vars.VITE_FEATURE_AUTH }}
    steps:
      - run: echo "Déploiement ${{ github.ref_name }} -> ${{ github.ref_name == 'main' && 'production' || 'staging' }}"

  webapp:
    needs: [config, changes]
    if: needs.changes.outputs.webapp == 'true'
    uses: ./.github/workflows/build-and-deploy-image.yml
    permissions:
      contents: read
      packages: write
    secrets: inherit
    with:
      environment: ${{ needs.config.outputs.environment }}
      image: ghcr.io/${{ github.repository }}/webapp
      dockerfile: apps/webapp/Dockerfile
      build-args: ${{ needs.config.outputs.webapp-build-args }}
      coolify-uuid-secret: COOLIFY_WEBAPP_UUID

  wordpress:
    needs: [config, changes]
    if: needs.changes.outputs.wordpress == 'true'
    uses: ./.github/workflows/build-and-deploy-image.yml
    permissions:
      contents: read
      packages: write
    secrets: inherit
    with:
      environment: ${{ needs.config.outputs.environment }}
      image: ghcr.io/${{ github.repository }}/wordpress
      dockerfile: apps/wordpress/Dockerfile
      coolify-uuid-secret: COOLIFY_WORDPRESS_UUID
      # WordPress tourne en ressource Compose : chemin API distinct (cf. reusable).
      coolify-resource: service
