#!/bin/bash
set -euo pipefail

# Doit être exécuté en root
if [[ "$EUID" -ne 0 ]]; then
  echo "❌ Ce script doit être exécuté avec sudo ou en tant que root."
  exit 1
fi

# Configuration
KEY_FILE="/root/.tailscale_api_inventory"
TAILNET="swallow-grue.ts.net"
API_URL="https://api.tailscale.com/api/v2/tailnet/${TAILNET}/devices"
FILTER_OS=""
FILTER_HOSTNAME=""
FILTER_ACTIVE_MINUTES=""
EXPORT_FORMAT="tsv"
OUTPUT_FILE=""

# Affichage de l'aide
usage() {
  cat <<EOF
Usage: $0 [options]

Options :
  --os <nom>               Filtrer par OS (ex: linux, windows, darwin)
  --hostname <motif>       Filtrer par motif dans le nom d'hôte
  --active-since <minutes> Afficher les appareils vus depuis X minutes
  --export csv|json|tsv    Format d'export (par défaut: tsv)
  --output <fichier>       Exporter la sortie vers un fichier
  --help                   Afficher cette aide

⚠️ Remarque : l'option --online est dépréciée et ignorée, utilisez --active-since à la place.
EOF
  exit 0
}

# Parsing des arguments
while [[ $# -gt 0 ]]; do
  case "$1" in
    --online) shift ;; # Ignoré volontairement (déprécié)
    --os) FILTER_OS="$2"; shift ;;
    --hostname) FILTER_HOSTNAME="$2"; shift ;;
    --active-since) FILTER_ACTIVE_MINUTES="$2"; shift ;;
    --export) EXPORT_FORMAT="$2"; shift ;;
    --output) OUTPUT_FILE="$2"; shift ;;
    --help) usage ;;
    *) echo "❌ Option inconnue: $1"; usage ;;
  esac
  shift
done

# Vérifie que la clé API existe
if [[ ! -f "$KEY_FILE" ]]; then
  echo "❌ Clé API introuvable : $KEY_FILE"
  exit 1
fi
API_KEY=$(< "$KEY_FILE")

# Appel API
response=$(curl -s -w "%{http_code}" -u "${API_KEY}:" "$API_URL")
http_code="${response: -3}"
json="${response:: -3}"

if [[ "$http_code" != "200" ]]; then
  echo "❌ Erreur API ($http_code)"
  echo "🔍 Réponse : $json"
  exit 1
fi

if [[ -z "$json" || "$json" == "null" ]]; then
  echo "❌ Réponse vide de l’API Tailscale"
  exit 1
fi

# Timestamp limite pour active-since
now_epoch=$(date -u +%s)
if [[ -n "$FILTER_ACTIVE_MINUTES" ]]; then
  cutoff_epoch=$((now_epoch - (FILTER_ACTIVE_MINUTES * 60)))
fi

# Construction du filtre jq
jq_filter='.devices[]'

[[ -n "$FILTER_OS" ]] && jq_filter+=" | select(.os == \"$FILTER_OS\")"
[[ -n "$FILTER_HOSTNAME" ]] && jq_filter+=" | select(.hostname | test(\"$FILTER_HOSTNAME\"))"
if [[ -n "$FILTER_ACTIVE_MINUTES" ]]; then
  jq_filter+=" | select((.lastSeen | fromdateiso8601) >= $cutoff_epoch)"
fi

# Format de sortie
case "$EXPORT_FORMAT" in
  tsv)
    jq_script="[
      \"HOSTNAME\", \"IP\", \"OS\", \"LAST SEEN\"
    ], (
      $jq_filter |
      [.hostname, (.addresses[0] // \"n/a\"), .os, (.lastSeen // \"never\")]
    ) | @tsv"
    ;;
  csv)
    jq_script="$jq_filter | [.hostname, (.addresses[0] // \"n/a\"), .os, (.lastSeen // \"never\")] | @csv"
    ;;
  json)
    jq_script="[ $jq_filter | {hostname, ip: (.addresses[0] // \"n/a\"), os, lastSeen} ]"
    ;;
  *)
    echo "❌ Format d’export invalide : $EXPORT_FORMAT"
    usage
    ;;
esac

# Génération de la sortie
output=$(echo "$json" | jq -r "$jq_script")

# Affichage ou export
if [[ -n "$OUTPUT_FILE" ]]; then
  echo "$output" > "$OUTPUT_FILE"
  echo "✅ Exporté vers $OUTPUT_FILE"
else
  if [[ "$EXPORT_FORMAT" == "tsv" ]]; then
    echo "$output" | column -t -s $'\t'
  else
    echo "$output"
  fi
fi