#!/usr/bin/env bash
# migrate-to-arje.sh — migra una máquina de su init actual a arje,
# absorbiendo su configuración de servicios.
#
# QUÉ HACE:
#   1. Compila arje-absorb (host).
#   2. Autodetecta el init actual (o --from) y absorbe sus servicios en
#      una Tarjeta Semilla (out/arje-absorbed.card.json por default).
#   3. (--with-carmen) agrega carmen-dm —el gestor de login gráfico— a
#      la Semilla y compila+instala mirada-compositor y mirada-greeter.
#   4. Pasa la Semilla a install-arje-as-init.sh, que instala arje en
#      paralelo a tu init actual, con su propia entrada GRUB.
#
# Tu init actual queda INTACTO y sigue siendo el default — arje se elige
# en GRUB. Revertir:  sudo scripts/uninstall-arje.sh
#
# systemd NO se absorbe (sus units no son un formato de texto trivial);
# para systemd usá install-arje-as-init.sh con seeds/arje-host.card.json.
# Este script cubre sysvinit / runit / dinit / OpenRC.
#
# USO:
#   sudo scripts/migrate-to-arje.sh [opciones]
#     --from <init>    sysvinit|runit|dinit|openrc|auto   (def: auto)
#     --with-carmen    agrega el escritorio carmen como gestor de login
#     --seed-out <f>   dónde escribir la Semilla absorbida
#                      (def: out/arje-absorbed.card.json)
#     --dry-run        absorbe y valida, sin instalar nada (no necesita root)

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"

FROM="auto"
WITH_CARMEN=0
DRY_RUN=0
SEED_OUT="$REPO_DIR/out/arje-absorbed.card.json"

while [ "$#" -gt 0 ]; do
  case "$1" in
    --from)        FROM="${2:?--from necesita un valor}"; shift 2 ;;
    --with-carmen) WITH_CARMEN=1; shift ;;
    --seed-out)    SEED_OUT="${2:?--seed-out necesita un valor}"; shift 2 ;;
    --dry-run)     DRY_RUN=1; shift ;;
    -h|--help)
      cat <<'USAGE'
migrate-to-arje.sh — migra una máquina a arje absorbiendo su init actual.
  --from <init>    sysvinit|runit|dinit|openrc|auto   (def: auto)
  --with-carmen    agrega el escritorio carmen como gestor de login
  --seed-out <f>   dónde escribir la Semilla absorbida
  --dry-run        absorbe y valida sin instalar (no necesita root)
USAGE
      exit 0 ;;
    *) echo "[migrate] opción desconocida: $1 (usá --help)" >&2; exit 2 ;;
  esac
done

cd "$REPO_DIR"

if [ "$DRY_RUN" -eq 0 ] && [ "$(id -u)" -ne 0 ]; then
  echo "[migrate] hace falta root para instalar — o corré con --dry-run" >&2
  exit 1
fi

echo "[migrate] paso 1/4: compilar arje-absorb"
cargo build --quiet --release -p arje-absorb
ABSORB="$REPO_DIR/target/release/arje-absorb"

echo "[migrate] paso 2/4: absorber el init actual (--from $FROM)"
mkdir -p "$(dirname "$SEED_OUT")"
ABSORB_ARGS=(--from "$FROM" --output "$SEED_OUT" --label "arje.seed.migrated")
[ "$WITH_CARMEN" -eq 1 ] && ABSORB_ARGS+=(--with-carmen)
"$ABSORB" "${ABSORB_ARGS[@]}"
echo "[migrate] Semilla escrita en: $SEED_OUT"
bash "$REPO_DIR/seeds/validate.sh" "$SEED_OUT"

if [ "$DRY_RUN" -eq 1 ]; then
  cat <<EOF

[migrate] --dry-run: Semilla absorbida y validada en
  $SEED_OUT
Revisala y, cuando quieras instalar:
  sudo scripts/install-arje-as-init.sh "$SEED_OUT"
EOF
  exit 0
fi

if [ "$WITH_CARMEN" -eq 1 ]; then
  echo "[migrate] paso 3/4: compilar e instalar carmen (compositor + greeter)"
  # carmen enlaza mesa/libdrm/libinput/libseat — se compila con el
  # target del host (glibc dinámico), NO musl: esta máquina ya tiene
  # esas librerías. Sólo el PID 1 y los shims van musl-static al initrd.
  cargo build --quiet --release -p mirada-compositor -p mirada-greeter
  install -m 0755 "$REPO_DIR/target/release/mirada-compositor" /usr/bin/mirada-compositor
  install -m 0755 "$REPO_DIR/target/release/mirada-greeter"    /usr/bin/mirada-greeter
  echo "  mirada-compositor y mirada-greeter instalados en /usr/bin/"
else
  echo "[migrate] paso 3/4: carmen omitido (sin --with-carmen)"
fi

echo "[migrate] paso 4/4: instalar arje como init"
"$SCRIPT_DIR/install-arje-as-init.sh" "$SEED_OUT"

cat <<EOF

[migrate] HECHO. arje quedó instalado en paralelo a tu init actual.
  - Semilla migrada:  $SEED_OUT  →  /ente/seed.card.json
  - tu init actual sigue siendo el default; arje se elige en GRUB.

Para arrancar arje una vez en el próximo boot:
  sudo grub-reboot "arje (init=/sbin/arje-zero) — kernel \$(uname -r)"
  sudo reboot

Revertir todo:
  sudo scripts/uninstall-arje.sh
EOF
