#!/usr/bin/env bash
# SEO Insight — installe/actualise les unités systemd depuis le dépôt.
#
#   # DEPUIS LE COMPTE D'ADMINISTRATION, pas depuis `seoinsight` :
#   ssh -t <admin>@<hote> 'sudo /data/seo-insight/deploy/sync-systemd.sh'
#
# `seoinsight` est un compte de SERVICE : ses droits sudo se limitent à
# `systemctl restart` sur deux unités nommées, il n'est pas dans sudoers pour le
# reste et ne peut donc PAS lancer ce script. C'est le compte d'administration
# (sudo interactif, authentification SSH par clé) qui le fait — d'où le `-t`,
# nécessaire pour saisir le mot de passe sudo.
#
# POURQUOI CE SCRIPT EXISTE SÉPARÉMENT DE deploy.sh
# -------------------------------------------------
# deploy.sh tourne en tant que `seoinsight`, dont les droits sudo se limitent au
# redémarrage de deux services nommés. Lui donner en plus le droit d'écrire dans
# /etc/systemd/system et de recharger le démon reviendrait à lui donner root :
# n'importe quelle unité déposée là s'exécute avec les pleins droits. La copie
# des unités reste donc une opération root explicite, lancée à la main.
#
# deploy.sh, lui, DÉTECTE l'écart et le signale — il ne peut pas l'appliquer.
#
# ORDRE : lancer deploy.sh D'ABORD (il construit et redémarre l'app web), puis
# ce script. Le worker GSC interroge l'app web en local (APP_URL=127.0.0.1:3000)
# et son minuteur peut partir dès l'activation — voir plus bas.
#
# Idempotent : ne recopie que ce qui diffère, ne recharge le démon que si
# quelque chose a bougé.
set -euo pipefail

REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
SRC_DIR="$REPO_DIR/deploy/systemd"
DEST_DIR="/etc/systemd/system"

# Les minuteurs à activer. Les .service one-shot associés n'ont volontairement
# pas de section [Install] : c'est le minuteur qui porte la planification.
TIMERS=(seo-insight-gsc-worker.timer seo-insight-gsc-partitions.timer)

ENABLE_TIMERS=1
if [ "${1:-}" = "--no-enable" ]; then
	ENABLE_TIMERS=0
fi

if [ "$(id -u)" -ne 0 ]; then
	echo "✗ Ce script écrit dans $DEST_DIR : il doit tourner en root." >&2
	echo >&2
	if [ "$(id -un)" = "seoinsight" ]; then
		# Piège vécu : `seoinsight` a bien DES droits sudo (deux `systemctl
		# restart` en NOPASSWD), donc on croit pouvoir sudo n'importe quoi. Non —
		# il n'est pas dans sudoers pour le reste, et c'est volontaire.
		echo "  Tu es connecté en 'seoinsight', un compte de SERVICE : ses droits" >&2
		echo "  sudo se limitent au redémarrage de deux unités nommées. Il ne peut" >&2
		echo "  pas lancer ce script, et c'est délibéré (écrire dans $DEST_DIR" >&2
		echo "  est root-équivalent)." >&2
		echo >&2
		echo "  Reconnecte-toi avec le compte d'ADMINISTRATION :" >&2
		echo "      ssh -t <admin>@<hote> 'sudo $0 ${1:-}'" >&2
	else
		echo "      sudo $0 ${1:-}" >&2
	fi
	exit 1
fi

if [ ! -d "$SRC_DIR" ]; then
	echo "✗ Introuvable : $SRC_DIR" >&2
	exit 1
fi

changed=()

echo "▸ Comparaison des unités du dépôt avec $DEST_DIR…"
for src in "$SRC_DIR"/*.service "$SRC_DIR"/*.timer; do
	[ -e "$src" ] || continue
	name="$(basename "$src")"
	dest="$DEST_DIR/$name"

	if [ -f "$dest" ] && cmp -s "$src" "$dest"; then
		echo "  = $name"
		continue
	fi

	if [ -f "$dest" ]; then
		echo "  ~ $name (modifiée)"
	else
		echo "  + $name (absente)"
	fi
	install -m 0644 -o root -g root "$src" "$dest"
	changed+=("$name")
done

# L'unité de sync GSC a longtemps été un démon (Type=simple, boucle infinie)
# activé au boot. Le dépôt l'a remplacée par un one-shot piloté par minuteur, qui
# n'a plus de [Install]. Si l'ancienne version est restée activée, elle relancerait
# une seconde sync en parallèle du minuteur : on la désactive, sans exiger qu'elle
# existe.
if systemctl is-enabled --quiet seo-insight-gsc-worker.service 2>/dev/null; then
	echo "▸ Désactivation de l'ancien démon seo-insight-gsc-worker.service…"
	systemctl disable seo-insight-gsc-worker.service
	systemctl stop seo-insight-gsc-worker.service 2>/dev/null || true
	changed+=("seo-insight-gsc-worker.service (ancien démon désactivé)")
fi

if [ ${#changed[@]} -eq 0 ]; then
	echo "✓ Aucune unité à mettre à jour."
else
	echo "▸ Rechargement du démon systemd…"
	systemctl daemon-reload
fi

if [ "$ENABLE_TIMERS" -eq 1 ]; then
	for timer in "${TIMERS[@]}"; do
		# `enable --now` est idempotent : réactiver un minuteur déjà actif ne le
		# remet pas à zéro. En revanche il peut DÉCLENCHER immédiatement — le
		# minuteur GSC est en OnBootSec=10min, donc sur une machine allumée depuis
		# longtemps l'échéance est déjà dépassée au moment de l'activation.
		echo "▸ Activation de $timer…"
		systemctl enable --now "$timer"
	done
fi

echo
echo "✓ Unités synchronisées."
if [ ${#changed[@]} -gt 0 ]; then
	printf '  modifiées : %s\n' "${changed[@]}"
fi
echo
echo "  État des minuteurs :"
systemctl list-timers --all 'seo-insight-*' --no-pager || true
echo
echo "  Premier run immédiat de la sync GSC (facultatif — le minuteur s'en charge) :"
echo "      sudo systemctl start seo-insight-gsc-worker.service"
echo "  Suivre :"
echo "      journalctl -u seo-insight-gsc-worker -u seo-insight-gsc-partitions -f"
