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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEV_PROM_E2E_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"

GENERATED_DIR="${DEV_PROM_E2E_ROOT}/generated"
GENERATED_COMPOSE_DIR="${GENERATED_DIR}/compose"
DEV_PROM_E2E_PROMETHEUS_PORT="${DEV_PROM_E2E_PROMETHEUS_PORT:-19190}"
DEV_PROM_E2E_GRAFANA_PORT="${DEV_PROM_E2E_GRAFANA_PORT:-13100}"
DEV_PROM_E2E_GRAFANA_ADMIN_USER="${DEV_PROM_E2E_GRAFANA_ADMIN_USER:-admin}"
DEV_PROM_E2E_GRAFANA_ADMIN_PASSWORD="${DEV_PROM_E2E_GRAFANA_ADMIN_PASSWORD:-admin}"
DEV_PROM_E2E_TAILSCALE_DIR="${GENERATED_DIR}/tailscale"
DEV_PROM_E2E_TAILSCALE_STATE_DIR="${DEV_PROM_E2E_TAILSCALE_DIR}/state"
DEV_PROM_E2E_TAILSCALE_SOCKET="${DEV_PROM_E2E_TAILSCALE_DIR}/tailscaled.sock"
DEV_PROM_E2E_TAILSCALE_PID_FILE="${DEV_PROM_E2E_TAILSCALE_DIR}/tailscaled.pid"
DEV_PROM_E2E_TAILSCALE_LOG_FILE="${DEV_PROM_E2E_TAILSCALE_DIR}/tailscaled.log"
DEV_PROM_E2E_TAILSCALE_PROXY_PORT="${DEV_PROM_E2E_TAILSCALE_PROXY_PORT:-1055}"
DEV_PROM_E2E_TAILSCALE_FUNNEL_PORT="${DEV_PROM_E2E_TAILSCALE_FUNNEL_PORT:-443}"
DEV_PROM_E2E_TAILSCALE_HOSTNAME="${DEV_PROM_E2E_TAILSCALE_HOSTNAME:-dev-prom-e2e-${USER:-user}}"
DEV_PROM_E2E_TAILSCALE_AUTHKEY="${DEV_PROM_E2E_TAILSCALE_AUTHKEY:-}"
DEV_PROM_E2E_TAILSCALE_AUTHKEY_FILE="${DEV_PROM_E2E_TAILSCALE_AUTHKEY_FILE:-}"

mkdir -p "${GENERATED_COMPOSE_DIR}/prometheus-data"
mkdir -p "${DEV_PROM_E2E_TAILSCALE_DIR}" "${DEV_PROM_E2E_TAILSCALE_STATE_DIR}"

require_command() {
  local cmd="$1"
  if ! type -P "${cmd}" >/dev/null 2>&1; then
    echo "❌ required command not found: ${cmd}" >&2
    exit 1
  fi
}

wait_http() {
  local url="$1"
  local attempts="${2:-30}"
  local i
  for i in $(seq 1 "${attempts}"); do
    if curl -sf "${url}" > /dev/null 2>&1; then
      return 0
    fi
    sleep 1
  done
  return 1
}

wait_for_path() {
  local path="$1"
  local attempts="${2:-30}"
  local i
  for i in $(seq 1 "${attempts}"); do
    if [[ -e "${path}" ]]; then
      return 0
    fi
    sleep 1
  done
  return 1
}

tailscale_cli() {
  command tailscale --socket="${DEV_PROM_E2E_TAILSCALE_SOCKET}" "$@"
}

read_tailscale_authkey() {
  if [[ -n "${DEV_PROM_E2E_TAILSCALE_AUTHKEY}" ]]; then
    printf '%s' "${DEV_PROM_E2E_TAILSCALE_AUTHKEY}"
    return 0
  fi

  if [[ -n "${DEV_PROM_E2E_TAILSCALE_AUTHKEY_FILE}" ]]; then
    if [[ ! -f "${DEV_PROM_E2E_TAILSCALE_AUTHKEY_FILE}" ]]; then
      echo "❌ tailscale auth key file not found: ${DEV_PROM_E2E_TAILSCALE_AUTHKEY_FILE}" >&2
      exit 1
    fi
    tr -d '\r\n' < "${DEV_PROM_E2E_TAILSCALE_AUTHKEY_FILE}"
  fi
}

tailscale_state_file() {
  printf '%s/tailscaled.state' "${DEV_PROM_E2E_TAILSCALE_STATE_DIR}"
}

render_prometheus_config() {
  cat > "${GENERATED_COMPOSE_DIR}/prometheus.yml" <<'EOF'
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: dev-integration-premium-keep-24h
    scheme: https
    metrics_path: /public_api/v1/clusters/10925905225882017226/metrics
    params:
      format: ["Prometheus"]
    bearer_token: 24a8f6dc59726bdcab8666557ca035b07e2c01866a17ec72e41216adde2352fa
    static_configs:
      - targets: ["us-west-2.aws.dev.prom.integration.tidbcloud.com"]
EOF
}

compose() {
  (
    cd "${DEV_PROM_E2E_ROOT}"
    DEV_PROM_E2E_PROMETHEUS_PORT="${DEV_PROM_E2E_PROMETHEUS_PORT}" \
    DEV_PROM_E2E_GRAFANA_PORT="${DEV_PROM_E2E_GRAFANA_PORT}" \
    DEV_PROM_E2E_GRAFANA_ADMIN_USER="${DEV_PROM_E2E_GRAFANA_ADMIN_USER}" \
    DEV_PROM_E2E_GRAFANA_ADMIN_PASSWORD="${DEV_PROM_E2E_GRAFANA_ADMIN_PASSWORD}" \
      docker-compose "$@"
  )
}
