#!/bin/bash
# install-akvorado.sh — Fatih agent self-install Akvorado stack
# Agent binary bootstrapAkvoradoIfNeeded() tarafından çağrılır.
# Idempotent, hata dönerse agent log'unda görünür.
#
# Kaynak: mon.nixcon.com.tr /repo/agent/
# 2026-07-05 v1.0 — Berk emri SSH-bypass rollout

set -e
REPO_URL="https://mon.nixcon.com.tr"

log_info()    { echo "[$(date +%H:%M:%S)] INFO: $*"; }
log_error()   { echo "[$(date +%H:%M:%S)] ERROR: $*" >&2; }
log_success() { echo "[$(date +%H:%M:%S)] OK: $*"; }

# Idempotent — zaten kurulu ve calisiyor mu?
if command -v docker >/dev/null 2>&1 && docker ps --filter "name=akvorado" --format "{{.Names}}" 2>/dev/null | grep -q akvorado; then
    log_success "Akvorado stack zaten calisiyor, install skip"
    exit 0
fi

# Disk yer kontrol (min 3 GB /var, 1 GB /tmp icin)
FREE_VAR=$(df -B1G /var/lib 2>/dev/null | awk 'NR==2 {print $4}')
FREE_TMP=$(df -B1G /tmp 2>/dev/null | awk 'NR==2 {print $4}')
if [ "${FREE_VAR:-0}" -lt 3 ]; then
    log_error "/var/lib icin yetersiz disk (${FREE_VAR}GB, min 3GB)"
    exit 3
fi
if [ "${FREE_TMP:-0}" -lt 1 ]; then
    log_error "/tmp icin yetersiz disk (${FREE_TMP}GB, min 1GB)"
    exit 3
fi

# 1. Docker install (offline mon'dan static tar)
if ! command -v docker >/dev/null 2>&1; then
    log_info "Docker yok, mon'dan offline install..."
    curl -# -L -o /tmp/docker.tgz "${REPO_URL}/repo/agent/docker/docker-27.3.1.tgz" || {
        log_error "Docker indirilemedi"; exit 1;
    }
    tar -C /tmp -xzf /tmp/docker.tgz
    cp /tmp/docker/* /usr/bin/
    rm -rf /tmp/docker /tmp/docker.tgz
    cat > /etc/systemd/system/docker.service << 'EOF'
[Unit]
Description=Docker Application Container Engine
After=network.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Restart=always
RestartSec=5
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable docker >/dev/null 2>&1
    systemctl start docker
    sleep 4
    log_success "Docker kuruldu: $(docker --version | head -1)"
else
    log_success "Docker zaten kurulu: $(docker --version | head -1)"
    systemctl enable docker >/dev/null 2>&1 || true
    systemctl is-active docker >/dev/null 2>&1 || systemctl start docker
fi

# 2. Docker Compose plugin (mon'dan)
if ! docker compose version >/dev/null 2>&1; then
    log_info "Docker Compose plugin kurulumu..."
    mkdir -p /usr/libexec/docker/cli-plugins
    curl -# -L -o /usr/libexec/docker/cli-plugins/docker-compose "${REPO_URL}/repo/agent/docker/docker-compose" || {
        log_error "docker-compose indirilemedi"; exit 1;
    }
    chmod +x /usr/libexec/docker/cli-plugins/docker-compose
fi
docker compose version >/dev/null 2>&1 || {
    log_error "docker compose plugin cagrilamadi"; exit 1;
}

# 3. Akvorado images (872 MB)
mkdir -p /opt/akvorado
cd /opt/akvorado

if [ ! -f /tmp/akvorado-images.tar ] || [ "$(stat -c%s /tmp/akvorado-images.tar 2>/dev/null)" -lt 800000000 ]; then
    log_info "Akvorado images 872 MB indiriliyor (uzun surebilir)..."
    curl -# -L -o /tmp/akvorado-images.tar "${REPO_URL}/repo/agent/docker-images/akvorado-images.tar" || {
        log_error "Images indirilemedi"; exit 1;
    }
fi

log_info "Docker imajlari yukleniyor..."
docker load -i /tmp/akvorado-images.tar 2>&1 | tail -5
rm -f /tmp/akvorado-images.tar

# 4. Config dosyalari
mkdir -p /opt/akvorado/config /opt/akvorado/clickhouse
for f in docker-compose.yml versions.yml prometheus.yml; do
    curl -sSL -o "/opt/akvorado/$f" "${REPO_URL}/repo/agent/akvorado/$f" 2>/dev/null || true
done
for f in akvorado.yaml outlet.yaml console.yaml inlet.yaml; do
    curl -sSL -o "/opt/akvorado/config/$f" "${REPO_URL}/repo/agent/akvorado/config/$f" 2>/dev/null || true
done

# 5. GeoIP MMDB
log_info "GeoIP MMDB indiriliyor..."
mkdir -p /var/lib/docker/volumes/akvorado_akvorado-geoip/_data
for f in dbip-asn-lite.mmdb dbip-country-lite.mmdb dbip-city-lite.mmdb; do
    curl -sSL -o "/tmp/$f" "${REPO_URL}/repo/agent/geoip/$f" 2>/dev/null || true
done
[ -f /tmp/dbip-asn-lite.mmdb ] && mv /tmp/dbip-asn-lite.mmdb /var/lib/docker/volumes/akvorado_akvorado-geoip/_data/asn.mmdb
[ -f /tmp/dbip-country-lite.mmdb ] && mv /tmp/dbip-country-lite.mmdb /var/lib/docker/volumes/akvorado_akvorado-geoip/_data/country.mmdb
[ -f /tmp/dbip-city-lite.mmdb ] && mv /tmp/dbip-city-lite.mmdb /var/lib/docker/volumes/akvorado_akvorado-geoip/_data/city.mmdb

# 6. Akvorado stack up
log_info "Akvorado stack baslatiliyor..."
cd /opt/akvorado
docker compose up -d 2>&1 | tail -10

sleep 10
UP_COUNT=$(docker ps --filter "name=akvorado" --format "{{.Names}}" | wc -l)
if [ "$UP_COUNT" -ge 6 ]; then
    log_success "Akvorado stack aktif — $UP_COUNT container up"
    docker ps --filter "name=akvorado" --format "{{.Names}}: {{.Status}}"
    exit 0
else
    log_error "Akvorado stack $UP_COUNT container up (beklenen 6+)"
    docker compose logs --tail 40 2>&1 | tail -40
    exit 2
fi
