#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════
#  init-secrets.sh — Génère la clé maître pour le chiffrement IRIS
#
#  À exécuter UNE fois sur le VPS, avant le premier déploiement de la
#  stack metrics ou de tout autre composant utilisant _secrets.php.
#
#  Cible :  ~/ddbuiq/secrets/iris-master.key
#           - 32 octets (256 bits) aléatoires lus depuis /dev/urandom
#           - chmod 600 vincentld:users
#           - hors webroot ~/ddbuiq/www/
#
#  Usage :
#    ./init-secrets.sh                # création si absent, no-op sinon
#    ./init-secrets.sh --force        # ÉCRASE la clé existante (DANGER !)
#    ./init-secrets.sh --status       # affiche l'état sans modifier
#
#  ATTENTION :
#    Si tu --force après avoir chiffré des secrets en base, ces secrets
#    deviendront irrécupérables. Procédure correcte de rotation :
#      1. lance un script qui déchiffre tous les secrets en base avec
#         l'ancienne clé et les stocke en mémoire
#      2. génère la nouvelle clé (--force)
#      3. rechiffre et UPDATE la base avec la nouvelle clé
#    Ce script est PAS celui-là — c'est juste l'initialisation.
#
#  Cf. doc 14-vps-apis-and-secrets.md.
# ═══════════════════════════════════════════════════════════════════════

set -euo pipefail

# Détection du home : si on tourne en sudo, on veut le home du user
# qui a invoqué sudo, pas /root. Sinon $HOME marche.
TARGET_HOME="${SUDO_USER:+$(getent passwd "$SUDO_USER" | cut -d: -f6)}"
TARGET_HOME="${TARGET_HOME:-$HOME}"

SECRETS_DIR="${TARGET_HOME}/ddbuiq/secrets"
KEY_PATH="${SECRETS_DIR}/iris-master.key"
KEY_LEN=32

# ── Args ──────────────────────────────────────────────────────────────
FORCE=0
STATUS_ONLY=0
for arg in "$@"; do
  case "$arg" in
    --force)   FORCE=1 ;;
    --status)  STATUS_ONLY=1 ;;
    -h|--help)
      grep '^#' "$0" | sed 's/^# \?//'
      exit 0
      ;;
    *)
      echo "ERR: argument inconnu: $arg" >&2
      exit 1
      ;;
  esac
done

# ── Status mode ───────────────────────────────────────────────────────
if [ "$STATUS_ONLY" = "1" ]; then
  echo "Target home : $TARGET_HOME"
  echo "Secrets dir : $SECRETS_DIR"
  echo "Key path    : $KEY_PATH"
  if [ -e "$SECRETS_DIR" ]; then
    echo "Dir exists  : yes ($(stat -c '%U:%G %a' "$SECRETS_DIR"))"
  else
    echo "Dir exists  : no"
  fi
  if [ -f "$KEY_PATH" ]; then
    SIZE=$(stat -c '%s' "$KEY_PATH")
    OWN=$(stat -c '%U:%G' "$KEY_PATH")
    PERMS=$(stat -c '%a' "$KEY_PATH")
    echo "Key exists  : yes (${SIZE}B, $OWN, $PERMS)"
    if [ "$SIZE" != "$KEY_LEN" ]; then
      echo "WARN: taille incorrecte (attendu ${KEY_LEN}B)"
    fi
  else
    echo "Key exists  : no"
  fi
  exit 0
fi

# ── Création de l'arborescence ─────────────────────────────────────────
if [ ! -d "$SECRETS_DIR" ]; then
  mkdir -p "$SECRETS_DIR"
  chmod 700 "$SECRETS_DIR"
  echo "OK: created $SECRETS_DIR (chmod 700)"
fi

# ── Vérif clé existante ────────────────────────────────────────────────
if [ -f "$KEY_PATH" ] && [ "$FORCE" != "1" ]; then
  echo "Key already exists at $KEY_PATH"
  echo "Use --force to overwrite (DANGER : will invalidate all encrypted secrets in DB)."
  echo "Use --status to inspect."
  exit 0
fi

if [ -f "$KEY_PATH" ] && [ "$FORCE" = "1" ]; then
  BACKUP="${KEY_PATH}.bak.$(date +%s)"
  cp -a "$KEY_PATH" "$BACKUP"
  chmod 600 "$BACKUP"
  echo "WARN: existing key backed up to $BACKUP (you have N seconds to ctrl-C, jk)"
fi

# ── Génération ─────────────────────────────────────────────────────────
# /dev/urandom est fine, pas besoin de /dev/random qui peut bloquer.
# 32 octets = 256 bits = clé AES-256.
head -c "$KEY_LEN" /dev/urandom > "$KEY_PATH"
chmod 600 "$KEY_PATH"

# ── Vérif ──────────────────────────────────────────────────────────────
SIZE=$(stat -c '%s' "$KEY_PATH")
if [ "$SIZE" != "$KEY_LEN" ]; then
  echo "ERR: clé générée a la mauvaise taille ($SIZE != $KEY_LEN)" >&2
  exit 1
fi

echo "OK: generated $KEY_PATH ($KEY_LEN bytes, chmod 600)"
echo "    owner=$(stat -c '%U:%G' "$KEY_PATH")  perms=$(stat -c '%a' "$KEY_PATH")"
echo
echo "Test the key from PHP :"
echo "  php -r 'require \"~/ddbuiq/www/iris-pi-common/_secrets.php\"; print_r(iris_secrets_status());'"
