name: CI-CD NDF Complet
run-name: Pipeline exécuté par ${{ github.actor }}

on:
  push:
    branches:
      - master

jobs:
  test-and-quality:
    runs-on: ubuntu-latest
    steps:
      - name: Récupération du code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Installation et Tests Node.js (Backend)
        run: |
          cd ndf/public/backend
          npm install
          if grep -q '"test":' package.json; then
            echo "Script de test trouvé - Lancement des tests..."
            npm test -- --coverage --watchAll=false
          else
            echo "Aucun script de test configuré. Passage à la suite."
          fi

      - name: Analyse SonarQube
        uses: sonarsource/sonarqube-scan-action@master
        continue-on-error: true
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
        with:
          args: >
            -Dsonar.projectKey=ndf-Gitea
            -Dsonar.sources=ndf/public/backend
            -Dsonar.javascript.lcov.reportPaths=ndf/public/backend/coverage/lcov.info

  deploy:
    needs: test-and-quality
    runs-on: ubuntu-latest
    env:
      PORTAINER_API: "https://myportainer.ensup-adm.net/api"
    steps:
      - name: Récupération du code pour le déploiement
        uses: actions/checkout@v3

      - name: Préparation du fichier docker-compose pour Gitea
        run: |
          sed -i '/build:/d' docker-compose.yml
          sed -i '/context:/d' docker-compose.yml
          sed -i '/dockerfile:/d' docker-compose.yml
          sed -i 's/8024:3024/8025:3024/g' docker-compose.yml
          sed -i 's/3025:81/3026:81/g' docker-compose.yml
          sed -i 's/container_name: ndf-backend/container_name: gitea-ndf-backend/g' docker-compose.yml
          sed -i 's/container_name: ndf-frontend/container_name: gitea-ndf-frontend/g' docker-compose.yml
          echo "Contenu du compose après modification :"
          cat docker-compose.yml

      - name: Envoi à l'API Portainer
        run: |
          echo "--- 1. Authentification ---"
          printf '{"username":"%s","password":"%s"}' "${{ secrets.PORTAINER_USER }}" "${{ secrets.PORTAINER_PASS }}" > auth.json
          TOKEN=$(curl -s -k -X POST "${PORTAINER_API}/auth" \
            -H "Content-Type: application/json" \
            -d @auth.json | grep -o '"jwt":"[^"]*"' | cut -d'"' -f4)
          rm -f auth.json

          if [ -z "$TOKEN" ]; then
            echo "Echec Login Portainer"
            exit 1
          fi
          echo "Authentification réussie"

          echo "--- 2. Récupération des IDs ---"
          ENDPOINT_ID=$(curl -s -k \
            -H "Authorization: Bearer $TOKEN" \
            "${PORTAINER_API}/endpoints" \
            | grep -o '"Id":[0-9]*,"Name":"myportainer-cgy-dev"' \
            | grep -o '[0-9]*' | head -n 1)
          echo "Endpoint ID : $ENDPOINT_ID"

          STACK_ID=$(curl -s -k \
            -H "Authorization: Bearer $TOKEN" \
            "${PORTAINER_API}/stacks" \
            | grep -o '"Id":[0-9]*,"Name":"gitea-action-dev"' \
            | grep -o '[0-9]*' | head -n 1)
          echo "Stack ID : $STACK_ID"

          echo "--- 3. Génération du Payload ---"
          node -e '
          const fs = require("fs");
          const compose = fs.readFileSync("docker-compose.yml", "utf8");
          const payload = {
            stackFileContent: compose,
            pullImage: true,
            prune: true
          };
          fs.writeFileSync("payload.json", JSON.stringify(payload));
          console.log("Payload size:", JSON.stringify(payload).length, "bytes");
          '

          echo "--- 4. Envoi à Portainer ---"
          RESPONSE=$(curl -s -k \
            --max-time 300      # attend jusqu'à 5 minutes
            --retry 3           # réessaie 3 fois si échec
            --retry-delay 10    # attend 10 secondes entre chaque tentative
            --retry-all-errors  # réessaie même sur les erreurs 5xx comme le 504
            -o response_body.json \
            -w "%{http_code}" \
            -X PUT "${PORTAINER_API}/stacks/${STACK_ID}?endpointId=${ENDPOINT_ID}" \
            -H "Authorization: Bearer ${TOKEN}" \
            -H "Content-Type: application/json" \
            -d @payload.json)

          echo "HTTP Code : $RESPONSE"
          echo "Réponse Portainer :"
          cat response_body.json

          if [ "$RESPONSE" = "200" ]; then
            echo "DEPLOIEMENT REUSSI - Frontend: 3026 / Backend: 8025"
          else
            echo "Erreur Portainer (Code HTTP $RESPONSE)"
            exit 1
          fi

          rm -f payload.json response_body.json