#!/bin/bash
# -----------------------------
# Gestionnaire interactif Git Flow

# ./flow.sh help

# Pilote rapidement :
#   - start-branch.sh
#   - finish-feature.sh
#   - create-release.sh
#   - deploy-release.sh
# -----------------------------

set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
START_SCRIPT="$SCRIPT_DIR/start-branch.sh"
FINISH_SCRIPT="$SCRIPT_DIR/finish-feature.sh"
CREATE_RELEASE_SCRIPT="$SCRIPT_DIR/create-release.sh"
DEPLOY_RELEASE_SCRIPT="$SCRIPT_DIR/deploy-release.sh"

print_title() {
  echo ""
  echo "========================================"
  echo "  Gestionnaire Git Flow"
  echo "========================================"
  echo ""
}

print_error() {
  echo "❌ $1"
}

print_success() {
  echo "✅ $1"
}

require_script() {
  if [ ! -f "$1" ]; then
    print_error "Script introuvable : $1"
    echo "Place ce gestionnaire dans le même dossier que les 4 scripts existants."
    exit 1
  fi

  if [ ! -x "$1" ]; then
    echo "Le script n'est pas exécutable : $1"
    read -p "Le rendre exécutable maintenant ? (yes/no) " MAKE_EXEC
    if [ "$MAKE_EXEC" = "yes" ]; then
      chmod +x "$1"
      print_success "Script rendu exécutable."
    else
      print_error "Impossible de continuer sans permission d'exécution."
      exit 1
    fi
  fi
}

require_git_repo() {
  if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
    print_error "Ce dossier n'est pas un dépôt Git."
    exit 1
  fi
}

ask_non_empty() {
  QUESTION="$1"
  VALUE=""

  while [ -z "$VALUE" ]; do
    read -p "$QUESTION" VALUE
    if [ -z "$VALUE" ]; then
      echo "Merci de renseigner une valeur."
    fi
  done

  echo "$VALUE"
}

confirm_action() {
  QUESTION="$1"
  read -p "$QUESTION (yes/no) " CONFIRM
  [ "$CONFIRM" = "yes" ]
}

show_status() {
  require_git_repo

  echo ""
  echo "Branche actuelle :"
  git branch --show-current

  echo ""
  echo "Statut Git :"
  git status --short

  echo ""
  echo "Derniers commits :"
  git log --oneline -5
}

start_branch_interactive() {
  require_script "$START_SCRIPT"
  require_git_repo

  echo ""
  echo "Quel type de branche veux-tu créer ?"
  echo "1) feature"
  echo "2) hotfix"
  read -p "Choix (1/2) : " TYPE_CHOICE

  case "$TYPE_CHOICE" in
    1) TYPE="feature" ;;
    2) TYPE="hotfix" ;;
    feature|hotfix) TYPE="$TYPE_CHOICE" ;;
    *)
      print_error "Choix invalide."
      exit 1
      ;;
  esac

  NAME=$(ask_non_empty "Nom court de la branche : ")

  echo ""
  echo "Résumé :"
  echo "Type : $TYPE"
  echo "Nom  : $NAME"
  echo "Commande : $START_SCRIPT $TYPE $NAME"
  echo ""

  if confirm_action "Créer cette branche ?"; then
    "$START_SCRIPT" "$TYPE" "$NAME"
  else
    echo "Annulé."
  fi
}

finish_feature_interactive() {
  require_script "$FINISH_SCRIPT"
  require_git_repo

  CURRENT_BRANCH=$(git branch --show-current)

  echo ""
  echo "Branche actuelle : $CURRENT_BRANCH"
  echo "Cette action va finaliser la branche actuelle et la merger dans develop."
  echo "Le script finish-feature.sh te demandera ensuite les confirmations nécessaires."
  echo ""

  if confirm_action "Continuer ?"; then
    "$FINISH_SCRIPT"
  else
    echo "Annulé."
  fi
}

create_release_interactive() {
  require_script "$CREATE_RELEASE_SCRIPT"
  require_git_repo

  VERSION=$(ask_non_empty "Version de la release, exemple 1.0.0 : ")

  echo ""
  echo "Résumé :"
  echo "Version : $VERSION"
  echo "Branche : release-$VERSION"
  echo "Commande : $CREATE_RELEASE_SCRIPT $VERSION"
  echo ""

  if confirm_action "Créer cette release ?"; then
    "$CREATE_RELEASE_SCRIPT" "$VERSION"
  else
    echo "Annulé."
  fi
}

deploy_release_interactive() {
  require_script "$DEPLOY_RELEASE_SCRIPT"
  require_git_repo

  VERSION=$(ask_non_empty "Version à déployer, exemple 1.0.0 : ")
  CURRENT_BRANCH=$(git branch --show-current)
  EXPECTED_BRANCH="release-$VERSION"

  echo ""
  echo "Résumé :"
  echo "Version attendue : $VERSION"
  echo "Branche attendue : $EXPECTED_BRANCH"
  echo "Branche actuelle : $CURRENT_BRANCH"
  echo "Commande : $DEPLOY_RELEASE_SCRIPT $VERSION"
  echo ""

  if [ "$CURRENT_BRANCH" != "$EXPECTED_BRANCH" ]; then
    echo "⚠️ Tu n'es pas sur $EXPECTED_BRANCH."
    if confirm_action "Faire git checkout $EXPECTED_BRANCH maintenant ?"; then
      git checkout "$EXPECTED_BRANCH"
    else
      echo "Annulé."
      exit 1
    fi
  fi

  echo ""
  echo "Cette action va merger la release vers master et develop, créer/pousser un tag, puis déployer sur le serveur."
  echo ""

  if confirm_action "Déployer cette release ?"; then
    "$DEPLOY_RELEASE_SCRIPT" "$VERSION"
  else
    echo "Annulé."
  fi
}

show_help() {
  cat <<HELP
Usage :
  ./flow.sh
  ./flow.sh start
  ./flow.sh finish
  ./flow.sh release
  ./flow.sh deploy
  ./flow.sh status
  ./flow.sh help

Mode interactif :
  Sans argument, le script affiche un menu et demande les détails au fur et à mesure.

Actions :
  start    Créer une branche feature ou hotfix
  finish   Finaliser la branche actuelle vers develop
  release  Créer une branche release-X.Y.Z
  deploy   Déployer une release
  status   Afficher la branche, le statut Git et les derniers commits
HELP
}

main_menu() {
  print_title
  echo "Que veux-tu faire ?"
  echo "1) Créer une branche feature/hotfix"
  echo "2) Finaliser la branche actuelle"
  echo "3) Créer une release"
  echo "4) Déployer une release"
  echo "5) Voir le statut Git"
  echo "6) Aide"
  echo "0) Quitter"
  echo ""
  read -p "Choix : " CHOICE

  case "$CHOICE" in
    1) start_branch_interactive ;;
    2) finish_feature_interactive ;;
    3) create_release_interactive ;;
    4) deploy_release_interactive ;;
    5) show_status ;;
    6) show_help ;;
    0) echo "À bientôt." ;;
    *)
      print_error "Choix invalide."
      exit 1
      ;;
  esac
}

case "$1" in
  "") main_menu ;;
  start) start_branch_interactive ;;
  finish) finish_feature_interactive ;;
  release) create_release_interactive ;;
  deploy) deploy_release_interactive ;;
  status) show_status ;;
  help|-h|--help) show_help ;;
  *)
    print_error "Commande inconnue : $1"
    echo ""
    show_help
    exit 1
    ;;
esac
