#!/bin/bash
#
# Test-runner o2switch pour api-may-facturation.
#
# Ce script tourne dans un checkout git DEDIE, distinct du dossier de prod
# (/home/sc1nkdm7108/tests-runner/api-may-facturation), jamais servi au web.
# Il recupere le dernier commit de la branche surveillee, reinstalle les
# dependances, prepare la base de test, lance PHPUnit, puis envoie un email
# de compte-rendu (succes ou echec) a chaque execution.
#
# ------------------------------------------------------------------
# USAGE AUTOMATIQUE (CRON, une fois par jour) :
#   Dans cPanel > Taches CRON, ajouter :
#     0 3 * * * /bin/bash /home/sc1nkdm7108/tests-runner/api-may-facturation/bin/run-tests-o2switch.sh
#   (3h du matin ; ajuster l'heure si besoin, minimum impose par o2switch : 5 min)
#
# USAGE MANUEL (apres un push, pour un retour immediat sans attendre le cron) :
#   1. Se connecter en SSH sur le serveur
#   2. Se placer dans le checkout dedie aux tests :
#        cd /home/sc1nkdm7108/tests-runner/api-may-facturation
#   3. Lancer le script :
#        bash bin/run-tests-o2switch.sh
#   4. Le mail de compte-rendu arrive automatiquement quelques instants apres.
#      Pour consulter le detail sans attendre le mail :
#        tail -n 100 var/log/tests-o2switch.log
#
# ------------------------------------------------------------------
# PRE-REQUIS SUR LE SERVEUR :
#   - Un checkout git separe de la prod (ce dossier), avec un remote
#     configure en acces non-interactif (Deploy Token GitLab en lecture seule)
#   - Un .env.test.local (non versionne, ignore par git) contenant la vraie
#     DATABASE_URL de la base de test dediee, distincte de la base de prod
#   - Une base MySQL/MariaDB dediee aux tests
#   - /usr/sbin/sendmail disponible pour l'envoi d'email
#
# ------------------------------------------------------------------

set -uo pipefail
export PATH=/usr/local/bin:/usr/bin:/bin:$PATH

PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BRANCH="main"
NOTIFY_EMAIL="christian.meneux@gmail.com"
LOG_FILE="${PROJECT_DIR}/var/log/tests-o2switch.log"
# Dossier du VRAI checkout de production (distinct de ce checkout dedie aux
# tests), utilise uniquement en lecture pour comparer les commits dans le
# rapport -- jamais modifie par ce script.
PROD_DIR="/home/sc1nkdm7108/api.may-facturation.fr"

cd "$PROJECT_DIR" || exit 1
mkdir -p "$(dirname "$LOG_FILE")"

(
    echo "=== Run $(date '+%Y-%m-%d %H:%M:%S') ==="

    git fetch origin "$BRANCH" && git reset --hard "origin/$BRANCH"
    if [ $? -ne 0 ]; then
        echo "ECHEC: git pull"
        exit 1
    fi

    composer install --no-interaction --no-progress
    if [ $? -ne 0 ]; then
        echo "ECHEC: composer install"
        exit 1
    fi

    APP_ENV=test php bin/console lexik:jwt:generate-keypair --skip-if-exists
    APP_ENV=test php bin/console doctrine:database:create --env=test --if-not-exists
    APP_ENV=test php bin/console doctrine:migrations:migrate --env=test -n

    APP_ENV=test php bin/phpunit --testdox --colors=never
    exit $?
) > "$LOG_FILE.tmp" 2>&1

STATUS=$?
cat "$LOG_FILE.tmp" >> "$LOG_FILE"

if [ $STATUS -eq 0 ]; then
    STATUS_LABEL="OK"
else
    STATUS_LABEL="ECHEC"
fi

# Comparaison des commits tests-runner / prod (lecture seule, ne modifie rien).
TESTS_COMMIT=$(git -C "$PROJECT_DIR" rev-parse --short HEAD 2>/dev/null || echo "inconnu")
if [ -d "$PROD_DIR/.git" ]; then
    PROD_COMMIT=$(git -C "$PROD_DIR" rev-parse --short HEAD 2>/dev/null || echo "inconnu")
else
    PROD_COMMIT="dossier introuvable ($PROD_DIR)"
fi
if [ "$TESTS_COMMIT" = "$PROD_COMMIT" ]; then
    SYNC_LABEL="prod A JOUR (meme commit)"
else
    SYNC_LABEL="prod EN RETARD -- deploiement necessaire"
fi

TAIL=$(tail -n 300 "$LOG_FILE.tmp")
{
    echo "Subject: Tests Runner : May-Facturation"
    echo "To: ${NOTIFY_EMAIL}"
    echo "Content-Type: text/plain; charset=utf-8"
    echo
    echo "Statut : ${STATUS_LABEL} ($(date '+%Y-%m-%d %H:%M'))"
    echo
    echo "Commit teste (main) : ${TESTS_COMMIT}"
    echo "Commit production   : ${PROD_COMMIT}"
    echo "-> ${SYNC_LABEL}"
    echo
    echo "--- Detail des tests (testdox) ---"
    echo "$TAIL"
} | /usr/sbin/sendmail -t

rm -f "$LOG_FILE.tmp"
exit $STATUS
