name: Deploy TEST

# Déclenché par un tag ``test-YYYY.MM.DD-N`` poussé sur main (ou n'importe
# quelle branche tagguée). Build l'artefact, push via SFTP vers
# ``/www/api-test/`` sur OVH, applique les migrations en attente puis
# healthcheck. Idempotent : on peut re-tag/re-déployer sans casser.
#
# Pré-requis :
#   - GitHub Environment ``test`` configuré avec les secrets suivants :
#     OVH_HOST, OVH_USER_TEST, OVH_PASS_TEST, MIGRATION_TOKEN_TEST,
#     DB_HOST_TEST, DB_NAME_TEST, DB_USER_TEST, DB_PASS_TEST
#   - Le sous-domaine ``test.api.spixer.fr`` doit pointer vers
#     ``/www/api-test/public/`` via OVH Multisite + SSL activé.

on:
  push:
    tags:
      - 'test-*'
  workflow_dispatch:
    inputs:
      tag:
        description: 'Tag à redéployer (utile pour re-jouer un déploiement)'
        required: false

jobs:
  deploy:
    name: Build + deploy + migrate + healthcheck
    runs-on: ubuntu-latest
    environment: test
    # 180 min pour absorber le 1er upload FTP (~5000 fichiers vendor/).
    # Les deploys suivants sont incrémentaux (state file sur le serveur)
    # et finissent en quelques minutes.
    timeout-minutes: 180

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ inputs.tag || github.ref }}

      - name: Set up PHP 8.1
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          tools: composer
          coverage: none

      - name: Cache Composer dependencies
        uses: actions/cache@v4
        with:
          path: vendor
          key: composer-${{ hashFiles('**/composer.lock') }}

      - name: Install production dependencies
        run: composer install --no-dev --optimize-autoloader --no-interaction --no-progress

      - name: Write version.json (consumed by /health)
        run: |
          cat > version.json <<EOF
          {
            "sha": "$(git rev-parse --short HEAD)",
            "tag": "$GITHUB_REF_NAME",
            "date": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
            "actor": "$GITHUB_ACTOR"
          }
          EOF
          cat version.json

      - name: Deploy to OVH via SFTP
        uses: SamKirkland/FTP-Deploy-Action@v4.3.5
        with:
          server: ${{ secrets.OVH_HOST }}
          username: ${{ secrets.OVH_USER_TEST }}
          password: ${{ secrets.OVH_PASS_TEST }}
          protocol: ftp
          local-dir: ./
          server-dir: /api-test/
          # Exclure tout ce qui ne doit pas finir sur le serveur prod :
          # - .git*           : historique git
          # - tests/, phpunit : tests unitaires (pas exécutés en prod)
          # - .env*           : credentials, géré séparément (cf. .env-test sur le serveur)
          # - node_modules    : non utilisé
          # - .github         : workflows, pas besoin sur le serveur
          # - docker*         : artefacts dev local
          # - *.md            : documentation
          exclude: |
            **/.git*
            **/.git*/**
            tests/**
            phpunit.xml*
            .env*
            node_modules/**
            **/.github/**
            **/Dockerfile*
            **/docker-compose*
            **/*.md
            **/database/**
            run_tests.sh

      - name: Run migrations
        run: |
          echo "→ Apply pending migrations sur test.api.spixer.fr"
          # -k : skip cert validation. OVH n'a généré que le cert pour
          # www.test.api.spixer.fr (pas pour la version no-www). Le data
          # reste chiffré HTTPS, juste sans validation cert — acceptable
          # pour un call interne CI. Fix propre : activer SSL Let's Encrypt
          # sur test.api.spixer.fr depuis le panel OVH.
          response=$(curl -fsSLk -w "\n__HTTP__:%{http_code}" \
            -X POST \
            --data "tag=$GITHUB_REF_NAME&mode=apply" \
            "https://test.api.spixer.fr/_internal/run-migrations.php?token=${{ secrets.MIGRATION_TOKEN_TEST }}" \
            -m 60)
          echo "$response"
          http_code=$(echo "$response" | tail -1 | sed 's/.*__HTTP__://')
          if [ "$http_code" != "200" ]; then
            echo "Migrations failed with HTTP $http_code"
            exit 1
          fi

      - name: Healthcheck
        run: |
          echo "→ Healthcheck"
          sleep 3
          response=$(curl -fsSk "https://test.api.spixer.fr/health.php" -m 15)
          echo "$response"
          echo "$response" | grep -q '"db_status": "ok"' || (echo "DB not ok"; exit 1)
          echo "$response" | grep -q "$GITHUB_REF_NAME" || echo "WARN: tag mismatch in version.json"

      - name: Summary
        if: always()
        run: |
          echo "### Deploy TEST" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "- Tag: \`$GITHUB_REF_NAME\`" >> $GITHUB_STEP_SUMMARY
          echo "- SHA: \`$(git rev-parse --short HEAD)\`" >> $GITHUB_STEP_SUMMARY
          echo "- URL: https://test.api.spixer.fr/" >> $GITHUB_STEP_SUMMARY
          echo "- Health: https://test.api.spixer.fr/health.php" >> $GITHUB_STEP_SUMMARY
