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

usage() {
  cat <<'USAGE'
Usage:
  check_hostfile_freshness --hostname <name> --warn <seconds> --crit <seconds> [--dir <path>]

Exit codes:
  0 OK, 1 WARN, 2 CRIT, 3 UNKNOWN
USAGE
}

HOSTNAME_ARG=""
WARN=""
CRIT=""
BASE_DIR="/var/lib/cmk-push-agent"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --hostname|-H) HOSTNAME_ARG="${2:-}"; shift 2 ;;
    --warn|-w)     WARN="${2:-}"; shift 2 ;;
    --crit|-c)     CRIT="${2:-}"; shift 2 ;;
    --dir|-d)      BASE_DIR="${2:-}"; shift 2 ;;
    --help|-h)     usage; exit 3 ;;
    *) echo "UNKNOWN - unknown argument: $1"; usage; exit 3 ;;
  esac
done

# validate
if [[ -z "$HOSTNAME_ARG" || -z "$WARN" || -z "$CRIT" ]]; then
  echo "UNKNOWN - missing required args"; usage
  exit 3
fi
if ! [[ "$WARN" =~ ^[0-9]+$ && "$CRIT" =~ ^[0-9]+$ ]]; then
  echo "UNKNOWN - warn/crit must be integers"
  exit 3
fi
if (( WARN <= 0 || CRIT <= 0 || WARN >= CRIT )); then
  echo "UNKNOWN - require 0 < warn < crit"
  exit 3
fi

FILE="${BASE_DIR}/${HOSTNAME_ARG}.gz"

now="$(date +%s)"
if [[ ! -f "$FILE" ]]; then
  perf="age_seconds=${CRIT};${WARN};${CRIT};0;"
  echo "CRITICAL - file not found: ${FILE} | ${perf}"
  exit 2
fi

mtime="$(stat -c %Y "$FILE" 2>/dev/null || true)"
if [[ -z "$mtime" ]]; then
  echo "UNKNOWN - cannot stat file: ${FILE}"
  exit 3
fi

age=$(( now - mtime ))
perf="age_seconds=${age};${WARN};${CRIT};0;"

if (( age >= CRIT )); then
  echo "CRITICAL - ${FILE} is ${age}s old | ${perf}"
  exit 2
elif (( age >= WARN )); then
  echo "WARNING - ${FILE} is ${age}s old | ${perf}"
  exit 1
else
  echo "OK - ${FILE} is ${age}s old | ${perf}"
  exit 0
fi
