#!/usr/bin/env bash
set -euo pipefail

API_BASE_URL="${DERIOX_GUARD_API_BASE_URL:-https://guard.deriox.ro}"
HEARTBEAT_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat"
POLICY_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat-policy"
VERSION="m8.9-heartbeat-cli-stub"

MODE="dry-run"
GATEWAY_UUID="${DERIOX_GUARD_GATEWAY_UUID:-}"
GATEWAY_NAME="${DERIOX_GUARD_GATEWAY_NAME:-Deriox Guard Mini PC}"
CAMERA_COUNT="0"
QUEUE_COUNT="0"

while [ $# -gt 0 ]; do
  case "$1" in
    --send-heartbeat) MODE="send-heartbeat"; shift ;;
    --show-payload) MODE="show-payload"; shift ;;
    --policy) MODE="policy"; shift ;;
    --gateway-uuid) GATEWAY_UUID="${2:-}"; shift 2 ;;
    --gateway-name) GATEWAY_NAME="${2:-}"; shift 2 ;;
    --camera-count) CAMERA_COUNT="${2:-0}"; shift 2 ;;
    --queue-count) QUEUE_COUNT="${2:-0}"; shift 2 ;;
    --api-base-url) API_BASE_URL="${2:-}"; HEARTBEAT_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat"; POLICY_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat-policy"; shift 2 ;;
    --help|-h)
      echo "Deriox Guard Heartbeat CLI - ${VERSION}"
      echo ""
      echo "Dry-run:"
      echo "  ./deriox-guard-heartbeat-cli.sh --gateway-uuid \"GW-...\""
      echo ""
      echo "Payload preview:"
      echo "  ./deriox-guard-heartbeat-cli.sh --show-payload --gateway-uuid \"GW-...\""
      echo ""
      echo "Trimite heartbeat metadata-only:"
      echo "  ./deriox-guard-heartbeat-cli.sh --send-heartbeat --gateway-uuid \"GW-...\""
      echo ""
      echo "Heartbeat policy:"
      echo "  ./deriox-guard-heartbeat-cli.sh --policy"
      exit 0
      ;;
    *)
      echo "Argument necunoscut: $1"
      echo "Rulează cu --help"
      exit 1
      ;;
  esac
done

detect_os() {
  if command -v lsb_release >/dev/null 2>&1; then
    lsb_release -ds 2>/dev/null | tr -d '"'
  elif [ -f /etc/os-release ]; then
    . /etc/os-release
    echo "${PRETTY_NAME:-Linux}"
  else
    echo "Linux"
  fi
}

uptime_seconds() {
  if [ -r /proc/uptime ]; then
    awk '{print int($1)}' /proc/uptime
  else
    echo 0
  fi
}

LOCAL_IP="$(hostname -I 2>/dev/null | awk '{print $1}' || true)"
OS_LABEL="$(detect_os)"
UPTIME="$(uptime_seconds)"

payload() {
  cat <<JSON
{
  "gateway_uuid": "${GATEWAY_UUID}",
  "gateway_name": "${GATEWAY_NAME}",
  "software_version": "${VERSION}",
  "os_label": "${OS_LABEL}",
  "local_ip_hint": "${LOCAL_IP}",
  "camera_count_reported": ${CAMERA_COUNT},
  "queue_count": ${QUEUE_COUNT},
  "uptime_seconds": ${UPTIME},
  "security": {
    "outbound_only": true,
    "metadata_only": true,
    "camera_password_included": false,
    "stream_link_included": false,
    "media_included": false,
    "billing_enabled": false,
    "camera_actions_enabled": false
  }
}
JSON
}

echo "=================================================="
echo "Deriox Guard Heartbeat CLI - ${VERSION}"
echo "=================================================="
echo "Mode: ${MODE}"
echo "API: ${API_BASE_URL}"
echo "Gateway UUID: ${GATEWAY_UUID:-necompletat}"
echo "OS: ${OS_LABEL}"
echo "Security: metadata-only, no camera passwords, no streams, no media, no billing"
echo ""

case "$MODE" in
  dry-run)
    echo "Dry-run. Nu trimit nimic către server."
    echo "Pentru payload: --show-payload"
    echo "Pentru heartbeat real metadata-only: --send-heartbeat --gateway-uuid \"GW-...\""
    ;;
  show-payload)
    if [ -z "$GATEWAY_UUID" ]; then
      echo "EROARE: --gateway-uuid este necesar pentru payload."
      exit 1
    fi
    payload
    ;;
  policy)
    if ! command -v curl >/dev/null 2>&1; then
      echo "EROARE: curl nu este instalat."
      exit 1
    fi
    curl -fsSL "$POLICY_ENDPOINT"
    echo ""
    ;;
  send-heartbeat)
    if [ -z "$GATEWAY_UUID" ]; then
      echo "EROARE: --gateway-uuid este necesar pentru heartbeat."
      exit 1
    fi
    if ! command -v curl >/dev/null 2>&1; then
      echo "EROARE: curl nu este instalat."
      exit 1
    fi
    echo "Trimit heartbeat metadata-only..."
    payload | curl -fsSL -X POST "$HEARTBEAT_ENDPOINT" -H "Content-Type: application/json" --data-binary @-
    echo ""
    ;;
esac