#!/bin/bash
# =============================================================================
# Terkom Diagnostic — bezpečná aktualizace na již nainstalovaném terminálu
# =============================================================================
#  - Přepíše skript, systemd unit + timer (jako install s FORCE_REINSTALL=1)
#  - NESAHÁ na: .terdiag-notify.env, terkom-diagnostic.runtime.yaml (instalátor je ponechá)
#  - Výchozí: NERESTARTUJE hlavní Terkom (výdej běží dál) — export DIAG_UPDATE_ONLY=1
#  - Záloha: před přepisem se zkopíruje terkom-diagnostic.sh do .pre-update.<timestamp>
#
# Použití (výchozí: CDN, bez restartu kiosku):
#   sudo ./update_diagnostic.sh
#   curl -fsSL https://cdn.public.altisima.cz/diagnostika/update_diagnostic.sh | sudo bash
#   (remount rw/ro řeší skript interně — není potřeba dělat ručně)
#
# Lokální kopie install + update ve stejné složce: automaticky ./install_diagnostic.sh
#
# Proč bych chtěl znovu projít plným režimem instalátoru (i restart Terkomu):
#   sudo env UPDATE_RESTART_TERKOM=1 ./update_diagnostic.sh
#
# Vlastní URL:
#   sudo env UPDATE_URL=https://.../install_diagnostic.sh ./update_diagnostic.sh
#
set -euo pipefail

if [ "$(id -u)" != "0" ]; then
    echo "[ERROR] Spusť jako root (sudo)." >&2
    exit 1
fi

TERKOM_HOME="/opt/terkom-ng/terkom"
SCRIPT_DIR="$TERKOM_HOME/scripts"
DIAG_SCRIPT="$SCRIPT_DIR/terkom-diagnostic.sh"
SERVICE_FILE="/etc/systemd/system/terkom-diagnostic.service"
TIMER_FILE="/etc/systemd/system/terkom-diagnostic.timer"
UPDATE_URL="${UPDATE_URL:-https://cdn.public.altisima.cz/diagnostika/install_diagnostic.sh}"
UPDATE_RESTART_TERKOM="${UPDATE_RESTART_TERKOM:-0}"
INSTALL_PSQL="${INSTALL_PSQL:-true}"
NOTIFY_ENV_FILE="$TERKOM_HOME/.terdiag-notify.env"
CONFIG_FILE="$TERKOM_HOME/config-local.yaml"

detect_ai_report_mail_enabled() {
    local value marker
    value=""
    if [ -f "$NOTIFY_ENV_FILE" ]; then
        value="$(grep -E '^AI_REPORT_MAIL_ENABLED=' "$NOTIFY_ENV_FILE" 2>/dev/null | tail -1 | cut -d= -f2- | tr -d "\"'" | xargs || true)"
    fi
    case "$(printf '%s' "$value" | tr '[:upper:]' '[:lower:]')" in
        true|1|yes|on) echo "true"; return ;;
        false|0|no|off) echo "false"; return ;;
    esac

    if [ -f "$CONFIG_FILE" ]; then
        marker="$(grep -oE 'DIAG_v[^ "'"'"']+' "$CONFIG_FILE" 2>/dev/null | head -1 || true)"
        case "$marker" in
            *_mail_ON) echo "true"; return ;;
            *_mail_OFF) echo "false"; return ;;
        esac
    fi

    echo "false"
}

if [ ! -f "$DIAG_SCRIPT" ] || [ ! -f "$SERVICE_FILE" ] || [ ! -f "$TIMER_FILE" ]; then
    echo "[ERROR] Terkom Diagnostic zde není nainstalován (chybí $DIAG_SCRIPT nebo systemd jednotky)." >&2
    echo "        Pro první instalaci použij install_diagnostic.sh (ne update)." >&2
    exit 1
fi

if [ "${SKIP_TIMER_CHECK:-0}" != "1" ] && ! systemctl is-enabled --quiet terkom-diagnostic.timer 2>/dev/null; then
    echo "[WARN] Timer terkom-diagnostic.timer není zapnutý. Aktualizace přesto proběhne (doporučeno: systemctl enable --now terkom-diagnostic.timer po aktualizaci)."
fi

# Kontrola verze — pokud je lokální verze shodná s remote, není co aktualizovat
FORCE_UPDATE="${FORCE_UPDATE:-0}"
if [ "$FORCE_UPDATE" != "1" ]; then
    LOCAL_VER="$(grep -m1 'SCRIPT_VERSION=' "$DIAG_SCRIPT" 2>/dev/null | tr -d '"' | cut -d= -f2 | xargs || true)"
    MY_DIR_CHECK="$(cd "$(dirname "$0")" && pwd)"
    if [ -f "$MY_DIR_CHECK/install_diagnostic.sh" ]; then
        REMOTE_VER="$(grep -m1 'INSTALLER_VERSION=' "$MY_DIR_CHECK/install_diagnostic.sh" 2>/dev/null | tr -d '"' | cut -d= -f2 | xargs || true)"
        REMOTE_SRC="lokální install_diagnostic.sh"
    else
        echo "[INFO] Stahuji vzdálenou verzi pro kontrolu: $UPDATE_URL"
        _TMP_CHECK="/tmp/terkom-diag-ver-check-$$.sh"
        if curl -fsSL "$UPDATE_URL" -o "$_TMP_CHECK" 2>/dev/null; then
            REMOTE_VER="$(grep -m1 'INSTALLER_VERSION=' "$_TMP_CHECK" 2>/dev/null | tr -d '"' | cut -d= -f2 | xargs || true)"
            REMOTE_SRC="$UPDATE_URL"
            # Stažený soubor použijeme i pro samotný update — uložíme ho
            _PREDOWNLOADED="$_TMP_CHECK"
        else
            echo "[WARN] Nepodařilo se zkontrolovat vzdálenou verzi (síť?). Pokračuji bez kontroly."
            REMOTE_VER=""
            REMOTE_SRC=""
        fi
    fi

    if [ -n "$LOCAL_VER" ] && [ -n "$REMOTE_VER" ] && [ "$LOCAL_VER" = "$REMOTE_VER" ]; then
        echo "[INFO] Verze ${LOCAL_VER} je aktuální — watchdog není potřeba aktualizovat."
        echo "       Pro vynucení plné aktualizace: sudo env FORCE_UPDATE=1 $0"
        # I při aktuální verzi: vždy synchronizuj VŠECHNY helper skripty (aktuální verze z CDN)
        _CDN_BASE="${CDN_BASE:-https://cdn.public.altisima.cz/diagnostika}"
        _SCRIPT_DIR="${TERKOM_HOME}/scripts"
        mount -o remount,rw / 2>/dev/null || true
        echo "[INFO] Synchronizace helper skriptů z CDN (vždy aktuální verze):"
        for _h in diag_info.sh apply_diagnostic_profile.sh check_diagnostic.sh set_ai_report_mail.sh; do
            if curl -fsSL --connect-timeout 10 "${_CDN_BASE}/${_h}" -o "$_SCRIPT_DIR/$_h" 2>/dev/null; then
                chmod 755 "$_SCRIPT_DIR/$_h"
                chown root:root "$_SCRIPT_DIR/$_h"
                echo "[OK]   $_h → $_SCRIPT_DIR/$_h"
            else
                echo "[WARN] Nepodařilo se stáhnout $_h z CDN."
            fi
        done
        sync || true
        mount -o remount,ro / 2>/dev/null || true
        rm -f "${_PREDOWNLOADED:-}" 2>/dev/null || true
        exit 0
    fi

    if [ -n "$LOCAL_VER" ] && [ -n "$REMOTE_VER" ]; then
        echo "[INFO] Aktualizace: ${LOCAL_VER} → ${REMOTE_VER} (zdroj: ${REMOTE_SRC})"
    elif [ -n "$LOCAL_VER" ]; then
        echo "[INFO] Lokální verze: ${LOCAL_VER} (vzdálenou verzi se nepodařilo zjistit)"
    fi
fi

remount_rw() {
    mount -o remount,rw / 2>/dev/null || true
    mount -o remount,rw /boot 2>/dev/null || true
}
remount_ro() {
    sync || true
    mount -o remount,ro /boot 2>/dev/null || true
    mount -o remount,ro / 2>/dev/null || true
}
trap remount_ro EXIT
remount_rw

TS="$(date '+%Y%m%d%H%M%S')"
BACKUP_FILE="${DIAG_SCRIPT}.pre-update.${TS}"
echo "[INFO] Záloha aktuálního skriptu: $BACKUP_FILE"
cp -a "$DIAG_SCRIPT" "$BACKUP_FILE" 2>/dev/null || { echo "[ERROR] Záloha se nepovedla (čtení $DIAG_SCRIPT)."; exit 1; }

MY_DIR="$(cd "$(dirname "$0")" && pwd)"
USE_LOCAL_INSTALLER=0
if [ -f "$MY_DIR/install_diagnostic.sh" ]; then
    INSTALLER_PATH="$MY_DIR/install_diagnostic.sh"
    USE_LOCAL_INSTALLER=1
    echo "[INFO] Použit lokální instalátor: $INSTALLER_PATH"
elif [ -n "${_PREDOWNLOADED:-}" ] && [ -f "${_PREDOWNLOADED}" ]; then
    # Instalátor byl již stažen při kontrole verze — znovu nestahujeme
    INSTALLER_PATH="$_PREDOWNLOADED"
    echo "[INFO] Použit předstažený instalátor (kontrola verze): $INSTALLER_PATH"
else
    echo "[INFO] Stahuji instalátor z: $UPDATE_URL"
    INSTALLER_PATH="/tmp/terkom-diagnostic-install-$$.sh"
    if ! curl -fsSL "$UPDATE_URL" -o "$INSTALLER_PATH"; then
        echo "[ERROR] Stažení selhalo. Zkontroluj URL nebo síť. Obnovíš zálohu: sudo cp -a $BACKUP_FILE $DIAG_SCRIPT" >&2
        rm -f "$INSTALLER_PATH" 2>/dev/null || true
        exit 1
    fi
fi
chmod 755 "$INSTALLER_PATH" 2>/dev/null || true
# Odstraň CRLF (Windows konce řádků) — způsobují selhání bash -n při uploadu z Windows
sed -i 's/\r//' "$INSTALLER_PATH" 2>/dev/null || true
BASH_ERR="$(bash -n "$INSTALLER_PATH" 2>&1 || true)"
if [ -n "$BASH_ERR" ]; then
    echo "[ERROR] Stažený skript není validní bash: $BASH_ERR" >&2
    echo "        Obnov zálohu: sudo cp -a $BACKUP_FILE $DIAG_SCRIPT" >&2
    echo "        Nebo zkus: curl -fsSL $UPDATE_URL | head -3" >&2
    [ "$USE_LOCAL_INSTALLER" = "0" ] && rm -f "$INSTALLER_PATH" 2>/dev/null || true
    exit 1
fi

export FORCE_REINSTALL=1
export INSTALL_PSQL
export AI_REPORT_MAIL_ENABLED="${AI_REPORT_MAIL_ENABLED:-$(detect_ai_report_mail_enabled)}"
echo "[INFO] Zachovavam AI_REPORT_MAIL_ENABLED=${AI_REPORT_MAIL_ENABLED} pro novy marker."
if [ "$UPDATE_RESTART_TERKOM" = "1" ]; then
    export DIAG_UPDATE_ONLY=0
    echo "[INFO] UPDATE_RESTART_TERKOM=1 — po aktualizaci se provede i restart hlavní Terkom služby (jako u čisté instalace)."
else
    export DIAG_UPDATE_ONLY=1
    echo "[INFO] Bezkontaktní režim: hlavní Terkom se nerestartuje (DIAG_UPDATE_ONLY=1). Pro plný režim: UPDATE_RESTART_TERKOM=1"
fi

echo "[INFO] Spouštím instalátor (aktualizace)..."
# shellcheck disable=SC1090,SC1091
bash "$INSTALLER_PATH" || {
    ex=$?
    echo "[ERROR] Instalátor skončil s kódem $ex. Můžeš vrátit předchozí skript: sudo cp -a $BACKUP_FILE $DIAG_SCRIPT && sudo systemctl daemon-reload" >&2
    [ "$USE_LOCAL_INSTALLER" = "0" ] && rm -f "$INSTALLER_PATH" 2>/dev/null || true
    exit "$ex"
}

[ "$USE_LOCAL_INSTALLER" = "0" ] && rm -f "$INSTALLER_PATH" 2>/dev/null || true

# Restart hlavního Terkomu — nutný aby načetl aktualizovaný marker ---DIA_v{ver} z config-local.yaml.
# Instalátor běžel s DIAG_UPDATE_ONLY=1 (neruší výdej), takže restart musíme provést sami.
detect_terkom_service() {
    local svc found

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

    # 2. Zkus známá jména (včetně "service" — na některých zařízeních skutečné jméno)
    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

    # 4. 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)"
    if [ -n "$found" ] && systemctl cat "$found" &>/dev/null; then echo "$found"; return; fi

    # 5. list-unit-files (všechny nakonfigurované unity, i nikdy nespuštěné)
    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)"
    if [ -n "$found" ] && systemctl cat "$found" &>/dev/null; then echo "$found"; return; fi

    echo ""
}

MAIN_SERVICE="$(detect_terkom_service)"

if [ -z "$MAIN_SERVICE" ]; then
    echo ""
    echo "[WARN] Nepodařilo se detekovat Terkom systemd unit — Terkom NEBYL restartován."
    echo "       Zjisti jméno service: sudo systemctl list-units --type=service | grep -iE 'terkom|kiosk'"
    echo "       Pak restartuj ručně:  sudo systemctl restart <jmeno-service>"
    echo "       (Marker ---DIA_v* je v config-local.yaml uložen — Terkom ho načte při příštím startu.)"
else
    echo "[INFO] Nalezena Terkom unit: $MAIN_SERVICE"
    echo "[INFO] Restart Terkomu ($MAIN_SERVICE) — načtení nového markeru v config-local.yaml..."
    systemctl stop "$MAIN_SERVICE" || true
    killall node 2>/dev/null || true
    sleep 2
    systemctl reset-failed "$MAIN_SERVICE" 2>/dev/null || true
    if systemctl start "$MAIN_SERVICE"; then
        sleep 2
        if systemctl is-active --quiet "$MAIN_SERVICE"; then
            echo "[OK] Terkom ($MAIN_SERVICE) je active — marker z config-local.yaml načten."
        else
            echo "[WARN] start vrátil 0, ale jednotka není active. Zkus: sudo systemctl restart $MAIN_SERVICE"
            systemctl status "$MAIN_SERVICE" --no-pager -l 2>&1 | head -n 15 || true
        fi
    else
        echo "[WARN] Nepodařilo se spustit Terkom ($MAIN_SERVICE)."
        echo "       Ručně: sudo systemctl stop $MAIN_SERVICE && killall node && sudo systemctl start $MAIN_SERVICE"
        systemctl status "$MAIN_SERVICE" --no-pager -l 2>&1 | head -n 15 || true
    fi
fi

echo
echo "[OK] Aktualizace dokončena. Záloha předchozí skript: $BACKUP_FILE"
echo "[INFO] Ověření: journalctl -u terkom-diagnostic.service -n 20 --no-pager"
exit 0
