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

# Idempotenter Linux-Installer für atcwatch (X-Plane ATC Matching Desktop
# Notifier). Herunterladen, entpacken, dieses Skript ausführen — kein
# "curl | bash". Ein zweiter Lauf ist sicher: er überschreibt weder eine
# vorhandene config.json noch bricht er ab.
#
# Legt an:
#   ${XDG_DATA_HOME:-$HOME/.local/share}/atcwatch/atcwatch/   Paket + venv
#   ${XDG_DATA_HOME:-$HOME/.local/share}/applications/atcwatch.desktop
#                                                              Desktop-Eintrag
#   ~/.config/systemd/user/atcwatch.service                    User-Unit
#   ~/atcwatch/config.json                                     Konfiguration
#
# Aktiviert NICHTS automatisch (kein enable/start) — die Befehle dafür
# werden am Ende ausgegeben.

script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

data_home="${XDG_DATA_HOME:-$HOME/.local/share}"
install_root="$data_home/atcwatch"
package_dir="$install_root/atcwatch"
venv_dir="$install_root/venv"
config_root="$HOME/atcwatch"
unit_dir="$HOME/.config/systemd/user"
unit_path="$unit_dir/atcwatch.service"
applications_dir="$data_home/applications"
desktop_path="$applications_dir/atcwatch.desktop"

echo "=== atcwatch Installer ==="
echo "Installationsroot: $install_root"

if ! command -v python3 >/dev/null 2>&1; then
    echo "Fehler: python3 wurde nicht gefunden. Bitte Python 3.11 oder neuer installieren." >&2
    exit 1
fi

python_version="$(python3 -c 'import sys; print("%d.%d" % sys.version_info[:2])')"
python_major="${python_version%%.*}"
python_minor="${python_version##*.}"
if [ "$python_major" -lt 3 ] || { [ "$python_major" -eq 3 ] && [ "$python_minor" -lt 11 ]; }; then
    echo "Fehler: python3 ist $python_version, atcwatch braucht 3.11 oder neuer." >&2
    exit 1
fi

if ! python3 -c 'import venv' >/dev/null 2>&1; then
    echo "Fehler: das venv-Modul fehlt. Unter Debian/Ubuntu: apt install python3-venv" >&2
    exit 1
fi

mkdir -p "$install_root" "$config_root" "$unit_dir" "$applications_dir"

echo "--- Paket nach $package_dir kopieren ---"
src_real="$(readlink -f "$script_dir")"
dst_real="$(readlink -f "$package_dir" 2>/dev/null || true)"
if [ -n "$dst_real" ] && [ "$src_real" = "$dst_real" ]; then
    echo "install.sh läuft bereits aus dem Zielverzeichnis — Kopie übersprungen."
else
    rm -rf "$package_dir"
    cp -R "$script_dir" "$package_dir"
fi
# Test-/Build-Beiwerk gehört nicht ins Installationsziel.
rm -rf "$package_dir/fixtures"
find "$package_dir" -name '__pycache__' -type d -prune -exec rm -rf {} +

echo "--- venv anlegen/aktualisieren ---"
if [ ! -x "$venv_dir/bin/python" ]; then
    python3 -m venv "$venv_dir"
fi
"$venv_dir/bin/pip" install --quiet --upgrade pip
"$venv_dir/bin/pip" install --quiet -r "$package_dir/requirements.txt"

echo "--- systemd-User-Unit installieren ---"
# Die Vorlage referenziert das Standard-Installationsroot (%h/.local/share/
# atcwatch); bei einem abweichenden XDG_DATA_HOME auf den echten Pfad setzen.
sed "s#%h/.local/share/atcwatch#$install_root#g" \
    "$package_dir/autostart/atcwatch.service" > "$unit_path"
chmod 644 "$unit_path"
systemctl --user daemon-reload

echo "--- Desktop-Eintrag installieren ---"
# Ohne .desktop-Datei ordnet Plasma die Meldungen keiner Anwendung zu: keine
# Glocke, kein Benachrichtigungsverlauf, kein Eintrag unter "Systemeinstellungen
# → Benachrichtigungen". Derselbe Platzhalter wie in der Unit-Vorlage.
sed "s#%h/.local/share/atcwatch#$install_root#g" \
    "$package_dir/autostart/atcwatch.desktop" > "$desktop_path"
chmod 644 "$desktop_path"
if command -v update-desktop-database >/dev/null 2>&1; then
    update-desktop-database "$applications_dir" >/dev/null 2>&1 || true
else
    echo "update-desktop-database nicht gefunden — übersprungen (der Eintrag" \
        "wird spätestens nach der nächsten Anmeldung erkannt)."
fi

echo "--- Konfiguration ---"
if [ -e "$config_root/config.json" ]; then
    echo "$config_root/config.json existiert bereits — unverändert gelassen."
else
    install -m 600 "$package_dir/config.example.json" "$config_root/config.json"
    echo "$config_root/config.json aus der Vorlage angelegt (URL: https://atc.emvisio.de)."
fi

echo "--- Test-Alarm ---"
# In $install_root ausführen (nicht im ggf. laufenden CWD des Aufrufers):
# `python -m atcwatch` stellt das CWD an den Anfang von sys.path. Läuft
# install.sh direkt aus dem entpackten Paketverzeichnis (das selbst eine
# Datei atcwatch.py enthält), würde diese Datei statt des Pakets gefunden
# werden — ImportError "attempted relative import with no known parent
# package", obwohl die Zustellung funktioniert.
if (cd "$install_root" && PYTHONPATH="$install_root" "$venv_dir/bin/python" -m atcwatch --test-alert); then
    echo "Test-Alarm zugestellt — Desktop-Notifications funktionieren."
else
    echo "Test-Alarm konnte NICHT zugestellt werden — siehe Meldung oben" \
        "(notify-send installiert? DBUS_SESSION_BUS_ADDRESS gesetzt?)." >&2
fi

cat <<EOF

=== Installation abgeschlossen ===

Noch NICHT aktiviert — dafür selbst ausführen:

  systemctl --user enable --now atcwatch.service

Status und Logs:

  systemctl --user status atcwatch.service
  journalctl --user -u atcwatch.service -n 50

Konfiguration: $config_root/config.json
Watchlist wird vom ATCMatch-Tab "My Airports" daneben geschrieben.
EOF
