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

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

CLUSTER_ID=""
ORG_ID=""
PROJECT_ID=""
USER_EMAIL="control-plane-e2e@local.dev"
TENANT_ID="60205"
GLOBAL_GATEWAY_PORT="18080"
GLOBAL_GRPC_PORT="18081"
REGIONAL_GATEWAY_PORT="18085"
REGIONAL_GRPC_PORT="18086"
MYSQL_PORT="13306"
MYSQL_DATABASE="metric_integration_dev"
MYSQL_HOST="mysql-clinic.cdllqpdubujz.us-west-2.rds.amazonaws.com"
MYSQL_USER="o11y"
MYSQL_PASSWORD="yW4EhFbixOtH"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --cluster-id) CLUSTER_ID="$2"; shift 2 ;;
    --org-id) ORG_ID="$2"; shift 2 ;;
    --project-id) PROJECT_ID="$2"; shift 2 ;;
    --user-email) USER_EMAIL="$2"; shift 2 ;;
    --tenant-id) TENANT_ID="$2"; shift 2 ;;
    --global-gateway-port) GLOBAL_GATEWAY_PORT="$2"; shift 2 ;;
    --global-grpc-port) GLOBAL_GRPC_PORT="$2"; shift 2 ;;
    --regional-gateway-port) REGIONAL_GATEWAY_PORT="$2"; shift 2 ;;
    --regional-grpc-port) REGIONAL_GRPC_PORT="$2"; shift 2 ;;
    --mysql-port) MYSQL_PORT="$2"; shift 2 ;;
    *)
      echo "unknown argument: $1" >&2
      exit 1
      ;;
  esac
done

if [[ -z "${CLUSTER_ID}" || -z "${ORG_ID}" || -z "${PROJECT_ID}" ]]; then
  echo "--cluster-id, --org-id and --project-id are required" >&2
  exit 1
fi

if ! command -v mirrord >/dev/null 2>&1; then
  echo "mirrord is required" >&2
  exit 1
fi

if ! command -v kubectl >/dev/null 2>&1; then
  echo "kubectl is required" >&2
  exit 1
fi

if ! command -v jq >/dev/null 2>&1; then
  echo "jq is required" >&2
  exit 1
fi

if ! command -v nc >/dev/null 2>&1; then
  echo "nc is required" >&2
  exit 1
fi

TMP_DIR=$(mktemp -d)
GLOBAL_CONFIG="${TMP_DIR}/global-control-plane-e2e.yaml"

cleanup() {
  local code=$?
  jobs -pr | xargs -r kill >/dev/null 2>&1 || true
  if [[ "${code}" -eq 0 ]]; then
    rm -rf "${TMP_DIR}"
  else
    echo "artifacts kept at ${TMP_DIR}" >&2
  fi
  exit "${code}"
}
trap cleanup EXIT

cp "${ROOT_DIR}/global/deployment/config/local/config.yaml" "${GLOBAL_CONFIG}"

python3 - <<'PY' "${GLOBAL_CONFIG}" "${REGIONAL_GATEWAY_PORT}" "${MYSQL_PORT}" "${MYSQL_DATABASE}" "${MYSQL_USER}" "${MYSQL_PASSWORD}"
import sys
import yaml

path = sys.argv[1]
regional_gateway_port = sys.argv[2]
mysql_port = int(sys.argv[3])
mysql_database = sys.argv[4]
mysql_user = sys.argv[5]
mysql_password = sys.argv[6]

with open(path, "r", encoding="utf-8") as f:
    cfg = yaml.safe_load(f)

cfg.setdefault("server", {})["enableEventBusConsumer"] = False
cfg.setdefault("debugConfig", {})["disableServerWorkflowCli"] = True
cfg["mysql"] = {
    "host": "127.0.0.1",
    "port": mysql_port,
    "user": mysql_user,
    "password": mysql_password,
    "database": mysql_database,
}
cfg["workflow"] = {
    **cfg.get("workflow", {}),
    "database": mysql_database,
}
regional_executor = cfg.setdefault("regionalExecutor", {})
regional_executor["servers"] = {
    "us-west-2": f"http://127.0.0.1:{regional_gateway_port}",
    "us-east-1": f"http://127.0.0.1:{regional_gateway_port}",
}
regional_executor["prometheusQueryEndpoints"] = {
    "us-west-2": "us-west-2.aws.dev.prom.integration.tidbcloud.com",
    "us-east-1": "us-west-2.aws.dev.prom.integration.tidbcloud.com",
    "us-west1": "us-west-2.aws.dev.prom.integration.tidbcloud.com",
}

with open(path, "w", encoding="utf-8") as f:
    yaml.safe_dump(cfg, f, sort_keys=False)
PY

wait_for_port() {
  local port="$1"
  local pid="$2"
  local name="$3"
  local log_file="$4"
  for _ in $(seq 1 60); do
    if nc -z 127.0.0.1 "${port}" >/dev/null 2>&1; then
      return 0
    fi
    if ! kill -0 "${pid}" >/dev/null 2>&1; then
      echo "${name} exited before opening 127.0.0.1:${port}" >&2
      if [[ -f "${log_file}" ]]; then
        echo "--- ${name} log ---" >&2
        cat "${log_file}" >&2
      fi
      return 1
    fi
    sleep 1
  done
  echo "timed out waiting for 127.0.0.1:${port} from ${name}" >&2
  if [[ -f "${log_file}" ]]; then
    echo "--- ${name} log ---" >&2
    cat "${log_file}" >&2
  fi
  return 1
}

MIRRORD_CHECK_VERSION=false mirrord port-forward \
  --config-file "${ROOT_DIR}/global/.mirrord/port-forward.yaml" \
  -L 10001:tidb-mgmt-svc-server-grpc:10001 \
  -L 10000:account-provider-grpc:10000 \
  -L "${MYSQL_PORT}:${MYSQL_HOST}:3306" \
  >"${TMP_DIR}/mirrord.log" 2>&1 &
MIRRORD_PID=$!
wait_for_port 10001 "${MIRRORD_PID}" "mirrord" "${TMP_DIR}/mirrord.log"
wait_for_port 10000 "${MIRRORD_PID}" "mirrord" "${TMP_DIR}/mirrord.log"
wait_for_port "${MYSQL_PORT}" "${MIRRORD_PID}" "mirrord" "${TMP_DIR}/mirrord.log"
mysqladmin ping --host 127.0.0.1 --port "${MYSQL_PORT}" --user "${MYSQL_USER}" --password="${MYSQL_PASSWORD}" --silent >/dev/null

(
  cd "${ROOT_DIR}/regional"
  go run ./cmd/regional-integration-server/main.go server \
    --grpc-port "${REGIONAL_GRPC_PORT}" \
    --gateway-port "${REGIONAL_GATEWAY_PORT}" \
    -c ./deployment/config/local/config.yaml
) >"${TMP_DIR}/regional.log" 2>&1 &
REGIONAL_PID=$!
wait_for_port "${REGIONAL_GATEWAY_PORT}" "${REGIONAL_PID}" "regional" "${TMP_DIR}/regional.log"
wait_for_port "${REGIONAL_GRPC_PORT}" "${REGIONAL_PID}" "regional" "${TMP_DIR}/regional.log"

(
  cd "${ROOT_DIR}/global"
  POD_NAME=metrics-integration-server \
    go run ./cmd/metrics-integration/main.go server \
    --grpc-port "${GLOBAL_GRPC_PORT}" \
    --gateway-port "${GLOBAL_GATEWAY_PORT}" \
    -c "${GLOBAL_CONFIG}"
) >"${TMP_DIR}/global.log" 2>&1 &
GLOBAL_PID=$!
wait_for_port "${GLOBAL_GATEWAY_PORT}" "${GLOBAL_PID}" "global" "${TMP_DIR}/global.log"
wait_for_port "${GLOBAL_GRPC_PORT}" "${GLOBAL_PID}" "global" "${TMP_DIR}/global.log"

echo "=== create metrics key via local global gRPC ==="
(
  cd "${ROOT_DIR}/global"
  go run ./cmd/control-plane-e2e-client/main.go \
    --addr "127.0.0.1:${GLOBAL_GRPC_PORT}" \
    --cluster-id "${CLUSTER_ID}" \
    --org-id "${ORG_ID}" \
    --project-id "${PROJECT_ID}" \
    --user-email "${USER_EMAIL}" \
    --tenant-id "${TENANT_ID}"
)

echo
echo "=== newest prometheus configmaps for cluster ${CLUSTER_ID} ==="
kubectl -n prometheus-integration get cm -o json \
  | jq -r --arg cluster_id "${CLUSTER_ID}" '
      .items[]
      | select(.data.cluster_id == $cluster_id)
      | [.metadata.creationTimestamp, .metadata.name, .data.cluster_id]
      | @tsv
    ' | sort | tail -n 5

echo
echo "=== logs ==="
echo "mirrord: ${TMP_DIR}/mirrord.log"
echo "regional: ${TMP_DIR}/regional.log"
echo "global:   ${TMP_DIR}/global.log"
