#!/usr/bin/env bash
# ============================================================================
# ONOX Slave Agent — Kurulum Scripti
# ============================================================================
# Bu script yeni eklenen slave node'da çalıştırılır. Master panelin admin
# panelinden üretilen kurulum komutunda kullanılır:
#
#   curl -fsSL https://panel.example.com/cluster/install-slave-agent.sh \
#       | ONOX_MASTER_URL=https://panel.example.com/api/v1/cluster \
#         ONOX_NODE_ID=42 \
#         ONOX_NODE_SECRET=<64-hex-secret> \
#         bash
#
# Yaptığı işler:
#   1. /etc/onoxsoft/cluster.env oluştur (0600 izinli)
#   2. /usr/local/onoxsoft/bin/onox-slave-agent.sh kopyala
#   3. systemd unit + timer yaz
#   4. daemon-reload + enable --now
#   5. İlk heartbeat'i doğrula (master DB'de last_heartbeat_at güncellendi mi)
# ============================================================================

set -euo pipefail

# ── Renkler ──────────────────────────────────────────────────────────────────
readonly C_OK="$(tput setaf 2 2>/dev/null || echo '')"
readonly C_ERR="$(tput setaf 1 2>/dev/null || echo '')"
readonly C_INFO="$(tput setaf 4 2>/dev/null || echo '')"
readonly C_OFF="$(tput sgr0 2>/dev/null || echo '')"

log()  { echo "${C_INFO}[onox-install]${C_OFF} $*"; }
ok()   { echo "${C_OK}[onox-install]${C_OFF} $*"; }
fail() { echo "${C_ERR}[onox-install] HATA:${C_OFF} $*" >&2; exit 1; }

# ── Root kontrolü ────────────────────────────────────────────────────────────
[[ $EUID -eq 0 ]] || fail "Bu script root olarak çalıştırılmalı (sudo bash ...)."

# ── Ortam değişkenleri ───────────────────────────────────────────────────────
ONOX_MASTER_URL="${ONOX_MASTER_URL:?ONOX_MASTER_URL gerekli (orn: https://panel.example.com/api/v1/cluster)}"
ONOX_NODE_ID="${ONOX_NODE_ID:?ONOX_NODE_ID gerekli (master panel adminden alin)}"
ONOX_NODE_SECRET="${ONOX_NODE_SECRET:?ONOX_NODE_SECRET gerekli (64-hex HMAC anahtari)}"

[[ "$ONOX_NODE_ID" =~ ^[0-9]+$ ]] || fail "ONOX_NODE_ID sayı olmalı, alındı: '${ONOX_NODE_ID}'"
[[ "$ONOX_NODE_SECRET" =~ ^[a-f0-9]{32,128}$ ]] || fail "ONOX_NODE_SECRET geçersiz format (32-128 hex char beklenir)."

# ── Bağımlılık kontrolü ──────────────────────────────────────────────────────
log "Bağımlılıklar kontrol ediliyor..."
MISSING=()
for cmd in curl jq openssl awk free df systemctl; do
    command -v "$cmd" &>/dev/null || MISSING+=("$cmd")
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
    log "Eksik bağımlılıklar yükleniyor: ${MISSING[*]}"
    if command -v dnf &>/dev/null; then
        dnf install -y "${MISSING[@]}" || fail "dnf install başarısız"
    elif command -v apt-get &>/dev/null; then
        apt-get update -y >/dev/null && apt-get install -y "${MISSING[@]}" || fail "apt-get install başarısız"
    else
        fail "Paket yöneticisi bulunamadı (dnf / apt-get)"
    fi
fi

# ── Dizinler ─────────────────────────────────────────────────────────────────
log "Dizinler hazırlanıyor..."
install -d -m 0755 /usr/local/onoxsoft/bin
install -d -m 0700 /etc/onoxsoft
install -d -m 0755 /var/log/onoxsoft

# ── cluster.env yaz ──────────────────────────────────────────────────────────
log "/etc/onoxsoft/cluster.env yazılıyor..."
umask 077
cat > /etc/onoxsoft/cluster.env <<ENV
# ONOX Slave Node — Otomatik üretildi $(date -Iseconds)
ONOX_MASTER_URL=${ONOX_MASTER_URL}
ONOX_NODE_SECRET=${ONOX_NODE_SECRET}
ONOX_NODE_ID=${ONOX_NODE_ID}
ENV
chmod 600 /etc/onoxsoft/cluster.env
chown root:root /etc/onoxsoft/cluster.env

# ── slave-agent.sh kur ───────────────────────────────────────────────────────
log "slave-agent.sh kuruluyor..."
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd 2>/dev/null || pwd)"
AGENT_SRC=""
if [[ -f "${SOURCE_DIR}/slave-agent.sh" ]]; then
    AGENT_SRC="${SOURCE_DIR}/slave-agent.sh"
elif [[ -f "/tmp/slave-agent.sh" ]]; then
    AGENT_SRC="/tmp/slave-agent.sh"
else
    # Master'dan indir
    log "Master'dan slave-agent.sh indiriliyor..."
    BASE_URL="${ONOX_MASTER_URL%/api/v1/cluster}"
    curl -fsSL "${BASE_URL}/cluster/slave-agent.sh" -o /tmp/slave-agent.sh \
        || fail "slave-agent.sh indirilemedi: ${BASE_URL}/cluster/slave-agent.sh"
    AGENT_SRC="/tmp/slave-agent.sh"
fi

install -m 0755 -o root -g root "$AGENT_SRC" /usr/local/onoxsoft/bin/onox-slave-agent.sh

# ── systemd unit + timer yaz ─────────────────────────────────────────────────
log "systemd unit + timer yazılıyor..."
cat > /etc/systemd/system/onox-slave-agent.service <<'UNIT'
[Unit]
Description=ONOX Slave Node Agent
Documentation=https://docs.onox.com.tr/cluster/slave-agent
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/etc/onoxsoft/cluster.env
ExecStart=/usr/local/onoxsoft/bin/onox-slave-agent.sh
StandardOutput=journal
StandardError=journal
SyslogIdentifier=onox-slave
User=root
Group=root
TimeoutStartSec=90
UNIT

cat > /etc/systemd/system/onox-slave-agent.timer <<'TIMER'
[Unit]
Description=ONOX Slave Node Agent — her dakika çalışır
Documentation=https://docs.onox.com.tr/cluster/slave-agent

[Timer]
OnBootSec=30s
OnUnitActiveSec=60s
AccuracySec=5s

[Install]
WantedBy=timers.target
TIMER

# ── Aktive et ────────────────────────────────────────────────────────────────
log "systemd reload + enable..."
systemctl daemon-reload
systemctl enable --now onox-slave-agent.timer

# İlk çalıştırma için elle bir kere tetikle
systemctl start onox-slave-agent.service || log "İlk çalıştırma başarısız (timer 30sn içinde tekrar deneyecek)"

# ── Doğrulama ────────────────────────────────────────────────────────────────
log "Heartbeat doğrulanıyor (5 saniye bekleniyor)..."
sleep 5

if systemctl is-active --quiet onox-slave-agent.timer; then
    ok "Timer aktif — her 60 saniyede bir heartbeat gönderilecek."
else
    fail "Timer aktif değil. journalctl -u onox-slave-agent.timer ile kontrol et."
fi

# Son çalıştırma log'unun ilk satırlarını göster
log "Son çalıştırma çıktısı (journalctl):"
journalctl -u onox-slave-agent.service -n 10 --no-pager 2>/dev/null || true

cat <<INFO

${C_OK}═══════════════════════════════════════════════════════════════════════${C_OFF}
${C_OK}  ONOX Slave Agent kurulumu tamamlandı!${C_OFF}
${C_OK}═══════════════════════════════════════════════════════════════════════${C_OFF}

  Node ID:      ${ONOX_NODE_ID}
  Master URL:   ${ONOX_MASTER_URL}
  Heartbeat:    her 60 saniyede bir
  Log:          journalctl -u onox-slave-agent.service -f
  Timer durum:  systemctl status onox-slave-agent.timer
  Manuel test:  systemctl start onox-slave-agent.service && journalctl -u onox-slave-agent.service -n 30

INFO

exit 0
