#!/bin/bash
set -euo pipefail

if [ "$(id -u)" != "0" ]; then
    echo "[ERROR] Tento skript musí být spuštěn jako root (sudo)." >&2
    exit 1
fi

echo "[INFO] Uninstalling Terkom Diagnostic..."

TERKOM_HOME="/opt/terkom-ng/terkom"
SCRIPT_DIR="$TERKOM_HOME/scripts"
DIAG_SCRIPT="$SCRIPT_DIR/terkom-diagnostic.sh"
PERSIST_DIR="$SCRIPT_DIR/diagnostic"
CONFIG_FILE="$TERKOM_HOME/config-local.yaml"
SERVICE_FILE="/etc/systemd/system/terkom-diagnostic.service"
TIMER_FILE="/etc/systemd/system/terkom-diagnostic.timer"
STATE_DIR="/run/terkom-diagnostic"
REMOVE_LOGS="${REMOVE_LOGS:-false}"
REMOVE_PSQL="${REMOVE_PSQL:-false}"
RESTART_TERKOM_ON_UNINSTALL="${RESTART_TERKOM_ON_UNINSTALL:-true}"

# Robustní detekce Terkom service jména (nerozbije restart při neznámém jméně)
_detect_terkom_service() {
    local svc found

    svc="${TERKOM_SERVICE:-}"
    if [ -n "$svc" ] && systemctl cat "$svc" &>/dev/null; then echo "$svc"; return; fi

    # "service" může být skutečné jméno unit souboru na některých zařízeních
    for _c in terkom-ng-server terkom-ng terkom-server terkom kiosk service; do
        if systemctl cat "$_c" &>/dev/null; then echo "$_c"; return; fi
    done

    # list-units --all: zahrnuje zastavené i failed unity
    found="$(systemctl list-units --all --type=service --no-legend 2>/dev/null \
        | awk '{print $1}' | grep -iE 'terkom|kiosk' | grep -v 'terkom-diagnostic' | head -1 || true)"
    [ -n "$found" ] && systemctl cat "$found" &>/dev/null && { echo "$found"; return; }

    # list-unit-files: všechny nakonfigurované unity bez ohledu na stav
    found="$(systemctl list-unit-files --type=service --no-legend 2>/dev/null \
        | awk '{print $1}' | grep -iE 'terkom|kiosk' | grep -v 'terkom-diagnostic' | head -1 || true)"
    [ -n "$found" ] && systemctl cat "$found" &>/dev/null && { echo "$found"; return; }

    echo ""
}

SERVICE="$(_detect_terkom_service)"
if [ -n "$SERVICE" ]; then
    echo "[INFO] Detekována Terkom unit: $SERVICE"
elif [ "$RESTART_TERKOM_ON_UNINSTALL" != "true" ]; then
    echo "[INFO] Restart Terkomu po uninstall je vypnuty."
else
    echo "[WARN] Terkom service unit nenalezena — Terkom nebude automaticky restartován."
fi

# Startup kontrola: zobrazí, které helper skripty jsou/chybí (informativní)
echo "[INFO] Kontrola helper skriptů na zařízení:"
for _chk in diag_info.sh apply_diagnostic_profile.sh check_diagnostic.sh; do
    if [ -f "$SCRIPT_DIR/$_chk" ]; then
        echo "[OK]   $SCRIPT_DIR/$_chk"
    else
        echo "[??]   $SCRIPT_DIR/$_chk — chybí"
    fi
done
unset _chk

mount -o remount,rw / 2>/dev/null || true
mount -o remount,rw /boot 2>/dev/null || true

systemctl disable --now terkom-diagnostic.timer 2>/dev/null || true
systemctl stop terkom-diagnostic.service 2>/dev/null || true

rm -f "$TIMER_FILE" "$SERVICE_FILE" "$DIAG_SCRIPT"
rm -rf "$STATE_DIR"

# Zálohy apt souborů vytvořené při instalaci
rm -f /etc/apt/sources.list.terkom-diagnostic.bak
rm -f /etc/apt/sources.list.d/yarn.list.terkom-diagnostic.bak
echo "[INFO] Removed apt backup files (if any)."

if [ "$REMOVE_LOGS" = "true" ]; then
    rm -rf "$PERSIST_DIR"
    echo "[INFO] Removed diagnostic logs: $PERSIST_DIR"
else
    echo "[INFO] Diagnostic logs kept: $PERSIST_DIR"
fi

# Zastavit Terkom před editací configu — další start načte popis z disku a sníží riziko starého node / obsazeného portu 3000.
if [ -n "$SERVICE" ]; then
    echo "[INFO] Stopping Terkom ($SERVICE) before config edit..."
    systemctl stop "$SERVICE" 2>/dev/null || echo "[WARN] systemctl stop '$SERVICE' skončil s chybou (může být již zastaveno)."
    killall node 2>/dev/null || true
    sleep 2
else
    echo "[INFO] Žádná Terkom service — přeskakuji stop."
fi

if [ -f "$CONFIG_FILE" ]; then
    # Nový formát: DIAG_v2.2.7_P1 (s leading space)
    sed -i 's/ DIAG_v[^ "]*//g' "$CONFIG_FILE"
    # Starší formát: ---DIA_v*
    sed -i 's/---DIA_v[^ "]*//g' "$CONFIG_FILE"
    # Úplně starý formát: ---DIAGNOSTIKA
    sed -i 's/---[[:space:]]*DIAGNOSTIKA[[:space:]]*//g' "$CONFIG_FILE"
    sed -i 's/---DIAGNOSTIKA//g' "$CONFIG_FILE"
    echo "[INFO] Odstraněn diagnostic marker (DIAG_v* / ---DIA_v* / ---DIAGNOSTIKA) z config-local.yaml."
fi

marker_after=0
if [ -f "$CONFIG_FILE" ]; then
    marker_after=$( (grep -oE 'DIAG_v[^ "]*|---DIA_v[^ "]*|---DIAGNOSTIKA' "$CONFIG_FILE" 2>/dev/null || true) | wc -l)
    marker_after=$(echo "$marker_after" | tr -cd '0-9')
    marker_after=${marker_after:-0}
fi
if [ "${marker_after:-0}" -gt 0 ] 2>/dev/null; then
    echo "[WARN] Diagnostic marker stále v souboru ($marker_after výskytů), zkontrolujte $CONFIG_FILE ručně."
fi

echo "[INFO] systemctl daemon-reload (synchronizace unit po odstranění diagnostiky)..."
systemctl daemon-reload

if [ -n "$SERVICE" ]; then
    echo "[INFO] Obnovení Terkomu ($SERVICE) po odinstalaci..."
    killall node 2>/dev/null || true
    sleep 1
    systemctl reset-failed "$SERVICE" 2>/dev/null || true
    if systemctl restart "$SERVICE" 2>/dev/null || systemctl start "$SERVICE"; then
        sleep 2
        if systemctl is-active --quiet "$SERVICE"; then
            echo "[OK] Terkom ($SERVICE) je active — popis bez DIA markeru načten."
        else
            echo "[WARN] start vrátil 0, ale jednotka není active. Zkus: sudo systemctl restart $SERVICE"
            systemctl status "$SERVICE" --no-pager -l 2>&1 | head -n 20 || true
        fi
    else
        echo "[WARN] Nepodařilo se spustit Terkom ($SERVICE)."
        echo "       Ručně: sudo systemctl stop $SERVICE && killall node && sudo systemctl start $SERVICE"
        systemctl status "$SERVICE" --no-pager -l 2>&1 | head -n 20 || true
    fi
elif [ "$RESTART_TERKOM_ON_UNINSTALL" != "true" ]; then
    echo "[INFO] RESTART_TERKOM_ON_UNINSTALL=${RESTART_TERKOM_ON_UNINSTALL} - Terkom po uninstall nerestartuji."
else
    echo "[WARN] Terkom service nenalezena — restartuj ručně:"
    echo "       sudo systemctl list-units --type=service | grep -iE 'terkom|kiosk'"
    echo "       sudo systemctl restart <jmeno-service>"
fi

systemctl daemon-reload
systemctl reset-failed 2>/dev/null || true

if [ "$REMOVE_PSQL" = "true" ]; then
    echo "[WARN] REMOVE_PSQL=true, removing PostgreSQL client packages."
    apt-get remove -y postgresql-client postgresql-client-common || true
    apt-get autoremove -y || true
else
    echo "[INFO] postgresql-client kept installed. Set REMOVE_PSQL=true to remove it manually."
fi

sync || true
mount -o remount,ro /boot 2>/dev/null || true
mount -o remount,ro / 2>/dev/null || true

echo "[OK] Uninstall complete."

if [ "${SKIP_REBOOT_ON_UNINSTALL:-}" = "1" ] || \
    [ "$(echo "${SKIP_REBOOT_ON_UNINSTALL:-}" | tr '[:upper:]' '[:lower:]')" = "true" ]; then
    echo "[INFO] SKIP_REBOOT_ON_UNINSTALL nastaveno — reboot se neprovede."
else
    echo "[INFO] Za 1 minutu proběhne reboot terminálu (Terkom Diagnostic odinstalováno)."
    echo "[INFO] Zrušení: sudo shutdown -c    |    Bez rebootu příště: SKIP_REBOOT_ON_UNINSTALL=1 sudo ./uninstall_diagnostic.sh"
    /sbin/shutdown -r +1 "Terkom Diagnostic uninstall: restart terminálu." 2>/dev/null || systemctl reboot
fi
