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

MODE="${1:-status}"
LAB_ROOT="${SORIA_LINUX_LAB:-${HOME}/soria-linux-lab}"
MARKER="${LAB_ROOT}/.soria-linux-lab"

usage() {
  cat <<'USAGE'
Usage:
  ./module1-linux-workspace.sh setup
  ./module1-linux-workspace.sh status
  ./module1-linux-workspace.sh reset

Optional:
  SORIA_LINUX_LAB=/tmp/my-lab ./module1-linux-workspace.sh setup
USAGE
}

normalize_root() {
  if command -v realpath >/dev/null 2>&1; then
    realpath -m "$LAB_ROOT"
  else
    printf '%s\n' "$LAB_ROOT"
  fi
}

assert_safe_root() {
  local normalized home_normalized
  normalized="$(normalize_root)"
  home_normalized="$(realpath -m "$HOME" 2>/dev/null || printf '%s' "$HOME")"

  case "$normalized" in
    /|"$home_normalized")
      echo "Refus: chemin de laboratoire dangereux: $normalized" >&2
      exit 1
      ;;
  esac

  case "$normalized" in
    "$home_normalized"/*|/tmp/*) ;;
    *)
      echo "Refus: le laboratoire doit rester sous HOME ou /tmp: $normalized" >&2
      exit 1
      ;;
  esac

  LAB_ROOT="$normalized"
  MARKER="${LAB_ROOT}/.soria-linux-lab"
}

setup_lab() {
  assert_safe_root
  if [[ -e "$LAB_ROOT" && ! -f "$MARKER" ]]; then
    echo "Refus: $LAB_ROOT existe mais n'est pas un laboratoire SORIA." >&2
    exit 1
  fi

  mkdir -p \
    "$LAB_ROOT/projets/app/config" \
    "$LAB_ROOT/projets/app/data" \
    "$LAB_ROOT/archives" \
    "$LAB_ROOT/logs" \
    "$LAB_ROOT/partage"

  printf 'soria-linux-lab\n' > "$MARKER"
  printf 'APP_ENV=lab\nAPP_PORT=8080\n' > "$LAB_ROOT/projets/app/config/application.env"
  printf 'alpha\nbeta\ngamma\n' > "$LAB_ROOT/projets/app/data/utilisateurs.txt"
  printf 'service started\nwarning: disk threshold\nservice stopped\n' > "$LAB_ROOT/logs/application.log"
  printf 'notes temporaires\n' > "$LAB_ROOT/projets/app/notes de test.txt"
  printf 'fichier cache du laboratoire\n' > "$LAB_ROOT/projets/app/.diagnostic"

  ln -f "$LAB_ROOT/projets/app/data/utilisateurs.txt" \
    "$LAB_ROOT/partage/utilisateurs-hardlink.txt"
  ln -sfn ../projets/app/config/application.env \
    "$LAB_ROOT/partage/application.env.link"

  chmod 750 "$LAB_ROOT/projets/app"
  chmod 640 "$LAB_ROOT/projets/app/config/application.env"
  chmod 600 "$LAB_ROOT/projets/app/.diagnostic"

  echo "Laboratoire créé dans: $LAB_ROOT"
  echo "Entre avec: cd '$LAB_ROOT'"
}

show_status() {
  assert_safe_root
  if [[ ! -f "$MARKER" ]]; then
    echo "Laboratoire absent: $LAB_ROOT"
    exit 1
  fi

  echo "Racine: $LAB_ROOT"
  echo
  echo "Arborescence:"
  find "$LAB_ROOT" -maxdepth 4 -printf '%M %u:%g %i %p -> %l\n' | sort
  echo
  echo "Liens vers utilisateurs.txt:"
  stat -c 'inode=%i links=%h mode=%A path=%n' \
    "$LAB_ROOT/projets/app/data/utilisateurs.txt" \
    "$LAB_ROOT/partage/utilisateurs-hardlink.txt"
}

reset_lab() {
  assert_safe_root
  if [[ ! -f "$MARKER" ]]; then
    echo "Refus: marker absent, rien n'est supprimé: $LAB_ROOT" >&2
    exit 1
  fi
  rm -rf --one-file-system "$LAB_ROOT"
  echo "Laboratoire supprimé: $LAB_ROOT"
}

case "$MODE" in
  setup) setup_lab ;;
  status) show_status ;;
  reset) reset_lab ;;
  -h|--help|help) usage ;;
  *) usage; exit 2 ;;
esac
