#!/usr/bin/env bash
set -euo pipefail

SCRIPT_NAME="$(basename "$0")"
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

usage() {
  cat <<USAGE
Usage: $SCRIPT_NAME [all|auto|manual] [--non-interactive]

Modes:
  all      Run automated checks, then run manual checklist (default)
  auto     Run only automated checks (qa + build)
  manual   Run only manual checklist

Options:
  --non-interactive   Print manual checklist without prompts
  -h, --help          Show this help
USAGE
}

log() {
  printf '\n[%s] %s\n' "$1" "$2"
}

run_cmd() {
  local description="$1"
  shift

  log RUN "$description"
  (cd "$ROOT_DIR" && "$@")
}

run_automated_checks() {
  log INFO "Automated validation started"
  run_cmd "Frontend + backend QA" npm run qa
  run_cmd "Production build" npm run build
  log OK "Automated validation passed"
}

print_manual_checklist() {
  cat <<'CHECKLIST'

Manual Graylog checklist (project UI):
1. Ouvre l'app: `npm run tauri dev`.
2. Va dans `Projet > Modules` et vérifie que `Polling Graylog + auto-resolve` est visible et activable.
3. Va dans `Projet > Graylog`.
   - Sauvegarde une config valide (URL, token, agents analyst/developer, seuil).
   - Clique `Tester la connexion` et vérifie le message de succès.
4. Lance `Poll manuel`.
   - Vérifie qu'au moins une détection apparaît dans `Dernières détections`.
   - Si score >= seuil, vérifie création d'un ticket dans `Tickets`.
5. Vérifie la dédup stricte:
   - Relance `Poll manuel` sans clôturer le ticket actif du même sujet.
   - Vérifie qu'un 2e ticket n'est pas créé pour ce sujet.
6. Ouvre le ticket créé:
   - Vérifie `Source: graylog` et `Source ref` dans le détail.
   - Vérifie le badge source dans la liste des tickets.
7. Retry/Cancel:
   - Vérifie que `Retry` et `Cancel` restent opérationnels pour les tickets Graylog.
CHECKLIST
}

prompt_step() {
  local step="$1"
  while true; do
    printf '\n%s\n' "$step"
    read -r -p "Résultat ? [y=ok / n=ko / s=skip / q=quit] " answer

    case "$answer" in
      y|Y)
        return 0
        ;;
      n|N)
        return 1
        ;;
      s|S)
        return 2
        ;;
      q|Q)
        return 3
        ;;
      *)
        echo "Réponse invalide. Utilise y/n/s/q."
        ;;
    esac
  done
}

run_manual_checklist() {
  local non_interactive="$1"

  print_manual_checklist

  if [ "$non_interactive" = "true" ]; then
    log INFO "Mode non interactif: checklist affichée uniquement"
    return 0
  fi

  local -a steps=(
    "1) Module Graylog visible et activable dans Projet > Modules"
    "2) Sauvegarde config Graylog + test connexion OK"
    "3) Poll manuel: détections visibles"
    "4) Ticket créé quand score >= seuil"
    "5) Dédup stricte vérifiée (pas de doublon actif)"
    "6) Détail ticket: source graylog + source_ref"
    "7) Retry/Cancel fonctionnels sur ticket Graylog"
  )

  local passed=0
  local failed=0
  local skipped=0

  for step in "${steps[@]}"; do
    if prompt_step "$step"; then
      passed=$((passed + 1))
    else
      code=$?
      if [ "$code" -eq 1 ]; then
        failed=$((failed + 1))
      elif [ "$code" -eq 2 ]; then
        skipped=$((skipped + 1))
      elif [ "$code" -eq 3 ]; then
        break
      fi
    fi
  done

  printf '\nSummary: passed=%d failed=%d skipped=%d\n' "$passed" "$failed" "$skipped"

  if [ "$failed" -gt 0 ]; then
    log ERROR "Checklist manuelle en échec"
    return 1
  fi

  log OK "Checklist manuelle validée"
}

main() {
  local mode="all"
  local non_interactive="false"

  if [ "$#" -gt 0 ]; then
    case "$1" in
      all|auto|manual)
        mode="$1"
        shift
        ;;
      -h|--help)
        usage
        return 0
        ;;
      *)
        echo "Unknown mode: $1" >&2
        usage >&2
        return 2
        ;;
    esac
  fi

  while [ "$#" -gt 0 ]; do
    case "$1" in
      --non-interactive)
        non_interactive="true"
        ;;
      -h|--help)
        usage
        return 0
        ;;
      *)
        echo "Unknown option: $1" >&2
        usage >&2
        return 2
        ;;
    esac
    shift
  done

  case "$mode" in
    auto)
      run_automated_checks
      ;;
    manual)
      run_manual_checklist "$non_interactive"
      ;;
    all)
      run_automated_checks
      run_manual_checklist "$non_interactive"
      ;;
  esac

  log OK "Validation Graylog terminée"
}

main "$@"
