#!/usr/bin/env bash
# ==============================================================================
# Gridbase Agent Telemetry & Asset Inventory Daemon (Linux amd64)
# "Every network. Every address. One single source of truth."
# ==============================================================================

CONFIG_FILE="/etc/gridbase/config.json"

if [ ! -f "$CONFIG_FILE" ]; then
  echo "[ERROR] Missing configuration file: $CONFIG_FILE"
  echo "Please run: curl -fsSL https://gridbase.ch/install-agent.sh | sudo bash -s -- --token=\"<YOUR_TOKEN>\""
  exit 1
fi

SERVER_URL=$(grep -o '"serverUrl": *"[^"]*"' "$CONFIG_FILE" 2>/dev/null | cut -d'"' -f4)
TOKEN=$(grep -o '"enrollmentToken": *"[^"]*"' "$CONFIG_FILE" 2>/dev/null | cut -d'"' -f4)
INTERVAL=$(grep -o '"syncIntervalSeconds": *[0-9]*' "$CONFIG_FILE" 2>/dev/null | grep -o '[0-9]*' || echo 3600)

if [ -z "$SERVER_URL" ]; then SERVER_URL="https://gridbase.ch"; fi
if [ -z "$INTERVAL" ]; then INTERVAL=3600; fi

echo "[+] Gridbase Agent Daemon starting..."
echo "[+] Target Server : $SERVER_URL"
echo "[+] Sync Interval : ${INTERVAL}s"

while true; do
  HOSTNAME=$(hostname)
  PRIMARY_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')
  PRIMARY_MAC=$(ip link show 2>/dev/null | grep -B1 "state UP" | awk '/link\/ether/ {print $2; exit}')
  MEM_TOTAL=$(awk '/MemTotal/ {print $2 * 1024}' /proc/meminfo 2>/dev/null || echo 0)
  CPU_MODEL=$(awk -F': ' '/model name/ {print $2; exit}' /proc/cpuinfo 2>/dev/null || echo "Unknown CPU")
  CPU_CORES=$(nproc 2>/dev/null || echo 1)
  UPTIME=$(awk '{print int($1)}' /proc/uptime 2>/dev/null || echo 0)
  OS_NAME=$(grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d'"' -f2 || uname -s)
  KERNEL_VER=$(uname -r)

  REBOOT_REQUIRED=false
  if [ -f /var/run/reboot-required ]; then
    REBOOT_REQUIRED=true
  fi

  # Query installed packages
  PKGS="[]"
  if command -v dpkg-query >/dev/null 2>&1; then
    PKG_LIST=$(dpkg-query -W -f='{"name":"${Package}","version":"${Version}","publisher":"Ubuntu Canonical"},\n' 2>/dev/null | head -n 300 | sed '$ s/,$//')
    if [ -n "$PKG_LIST" ]; then
      PKGS="[$PKG_LIST]"
    fi
  elif command -v rpm >/dev/null 2>&1; then
    PKG_LIST=$(rpm -qa --qf '{"name":"%{NAME}","version":"%{VERSION}","publisher":"%{VENDOR}"},\n' 2>/dev/null | head -n 300 | sed '$ s/,$//')
    if [ -n "$PKG_LIST" ]; then
      PKGS="[$PKG_LIST]"
    fi
  fi

  PAYLOAD=$(cat <<JSON
{
  "hostname": "$HOSTNAME",
  "type": "SERVER",
  "os": {
    "name": "$OS_NAME",
    "kernel": "$KERNEL_VER",
    "platform": "linux",
    "arch": "$(uname -m)"
  },
  "hardware": {
    "manufacturer": "$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null || echo 'Linux')",
    "model": "$(cat /sys/class/dmi/id/product_name 2>/dev/null || echo 'Generic Server')",
    "serial": "$(cat /sys/class/dmi/id/product_serial 2>/dev/null || echo 'Unknown')"
  },
  "cpu": {
    "model": "$CPU_MODEL",
    "cores": $CPU_CORES
  },
  "memory": {
    "totalBytes": $MEM_TOTAL
  },
  "network": {
    "primaryIp": "$PRIMARY_IP",
    "primaryMac": "$PRIMARY_MAC"
  },
  "security": {
    "bitLocker": false,
    "tpm": false,
    "secureBoot": false,
    "pendingReboot": $REBOOT_REQUIRED
  },
  "uptimeSeconds": $UPTIME,
  "agentVersion": "1.0.0",
  "installedSoftware": $PKGS
}
JSON
)

  HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$SERVER_URL/api/agent/telemetry" \
    --connect-timeout 10 \
    --max-time 30 \
    -H "Content-Type: application/json" \
    -H "X-Enrollment-Token: $TOKEN" \
    -d "$PAYLOAD" 2>/dev/null || echo "000")

  if [ "$HTTP_CODE" = "200" ]; then
    echo "[$(date -u +'%Y-%m-%d %H:%M:%SZ')] Telemetry synchronized successfully with Gridbase (HTTP $HTTP_CODE)."
  else
    echo "[$(date -u +'%Y-%m-%d %H:%M:%SZ')] Telemetry sync failed (HTTP $HTTP_CODE)."
  fi

  sleep "$INTERVAL"
done
