#!/bin/bash
# -----------------------------
# Annulation d'un déploiement de release branch
# chmod +x rollback-release.sh
# ./rollback-release.sh nom-de-ta-release
# -----------------------------

RELEASE_BRANCH=$1

SERVER_USER=tutoriu
SERVER_HOST=ftp.cluster030.hosting.ovh.net
SERVER_PATH=/homez.1548/tutoriu/old

if [ -z "$RELEASE_BRANCH" ]; then
  echo "Usage: ./rollback-release.sh <release-branch>"
  exit 1
fi

echo "⚠️ Annulation de la release : $RELEASE_BRANCH"
echo "Ce script va tenter de :"
echo "- supprimer le tag local et distant"
echo "- revenir master au commit précédent le merge"
echo "- revenir develop au commit précédent le merge"
echo "- remettre le serveur distant sur origin/master"
echo ""

read -p "Continuer ? (yes/no) " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
  echo "Annulation interrompue."
  exit 1
fi

# Sécurité : récupérer l'état distant
git fetch --all --tags

# -----------------------------
# 1️⃣ Suppression du tag
# -----------------------------

echo "Suppression du tag $RELEASE_BRANCH..."

git tag -d "$RELEASE_BRANCH" 2>/dev/null || echo "Tag local inexistant"
git push origin ":refs/tags/$RELEASE_BRANCH" 2>/dev/null || echo "Tag distant inexistant"

# -----------------------------
# 2️⃣ Rollback de master
# -----------------------------

echo "Rollback de master..."

git checkout master
git pull origin master

MASTER_MERGE_COMMIT=$(git log --merges --grep="merge release $RELEASE_BRANCH" --format="%H" -n 1)

if [ -z "$MASTER_MERGE_COMMIT" ]; then
  echo "❌ Aucun merge commit trouvé sur master pour $RELEASE_BRANCH"
else
  MASTER_PREVIOUS_COMMIT=$(git rev-parse "$MASTER_MERGE_COMMIT^1")

  echo "Merge master trouvé : $MASTER_MERGE_COMMIT"
  echo "Retour de master à : $MASTER_PREVIOUS_COMMIT"

  git reset --hard "$MASTER_PREVIOUS_COMMIT"
  git push origin master --force-with-lease
fi

# -----------------------------
# 3️⃣ Rollback de develop
# -----------------------------

echo "Rollback de develop..."

git checkout develop
git pull origin develop

DEVELOP_MERGE_COMMIT=$(git log --merges --grep="merge release $RELEASE_BRANCH" --format="%H" -n 1)

if [ -z "$DEVELOP_MERGE_COMMIT" ]; then
  echo "❌ Aucun merge commit trouvé sur develop pour $RELEASE_BRANCH"
else
  DEVELOP_PREVIOUS_COMMIT=$(git rev-parse "$DEVELOP_MERGE_COMMIT^1")

  echo "Merge develop trouvé : $DEVELOP_MERGE_COMMIT"
  echo "Retour de develop à : $DEVELOP_PREVIOUS_COMMIT"

  git reset --hard "$DEVELOP_PREVIOUS_COMMIT"
  git push origin develop --force-with-lease
fi

# -----------------------------
# 4️⃣ Optionnel : suppression de la release branch distante
# -----------------------------

read -p "Supprimer aussi la branche distante $RELEASE_BRANCH ? (yes/no) " DELETE_BRANCH

if [ "$DELETE_BRANCH" = "yes" ]; then
  git push origin --delete "$RELEASE_BRANCH" || echo "Impossible de supprimer la branche distante"
fi

# -----------------------------
# 5️⃣ Rollback du serveur distant
# -----------------------------

echo "Rollback du serveur distant sur origin/master..."

ssh "$SERVER_USER@$SERVER_HOST" << EOF
cd "$SERVER_PATH"
git fetch --all
git checkout master
git reset --hard origin/master
php bin/console cache:clear --env=prod
EOF

echo "✅ Rollback de la release $RELEASE_BRANCH terminé."