#!/bin/bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck disable=SC1091
. "$SCRIPT_DIR/common.sh"

usage() {
  cat >&2 <<'USAGE'
Usage:
  bootstrap_system_keyspace.sh [--plan|--apply]

Runs on a TiDB host after first start fails with "SYSTEM keyspace is not
bootstrapped". Starts a temporary SYSTEM-keyspace TiDB on explicitly selected
unused ports, waits for it to listen, then stops it so the normal
systemd-managed TiDB can retry.
Defaults to --plan.
USAGE
}

action="${1:---plan}"
case "$action" in
  --plan) apply=0 ;;
  --apply) apply=1 ;;
  --help) usage; exit 0 ;;
  *) usage; exit 1 ;;
esac

TIDB_DEPLOY_DIR="${TIDB_DEPLOY_DIR:-}"
SYSTEM_PORT="${SYSTEM_PORT:-}"
SYSTEM_STATUS_PORT="${SYSTEM_STATUS_PORT:-}"
SYSTEM_LOG_FILE="${SYSTEM_LOG_FILE:-/tmp/tidb-system-bootstrap.log}"
SYSTEM_STDOUT_FILE="${SYSTEM_STDOUT_FILE:-/tmp/tidb-system-bootstrap.stdout}"
SYSTEM_PID_FILE="${SYSTEM_PID_FILE:-/tmp/tidb-system-bootstrap.pid}"

require_env TIDB_DEPLOY_DIR PD_ENDPOINTS SYSTEM_PORT SYSTEM_STATUS_PORT

bootstrap_pid=""
stop_bootstrap() {
  if [ -n "$bootstrap_pid" ]; then
    kill "$bootstrap_pid" 2>/dev/null || true
    wait "$bootstrap_pid" 2>/dev/null || true
    bootstrap_pid=""
  fi
}
trap stop_bootstrap EXIT INT TERM

if [ "$apply" -eq 0 ]; then
  cat <<EOF
PLAN ONLY: temporary SYSTEM TiDB will not be started.
To bootstrap, run this script on a TiDB host: $0 --apply

Will run:
  deploy dir: $TIDB_DEPLOY_DIR
  PD endpoints: $PD_ENDPOINTS
  port/status: $SYSTEM_PORT/$SYSTEM_STATUS_PORT
  log: $SYSTEM_LOG_FILE
EOF
  exit 0
fi

cd "$TIDB_DEPLOY_DIR"
test -x ./bin/tidb-server || die "missing executable ./bin/tidb-server in $TIDB_DEPLOY_DIR"

nohup ./bin/tidb-server \
  --store=tikv \
  --path="$PD_ENDPOINTS" \
  -P "$SYSTEM_PORT" --status="$SYSTEM_STATUS_PORT" \
  --keyspace-name=SYSTEM \
  --log-file="$SYSTEM_LOG_FILE" \
  > "$SYSTEM_STDOUT_FILE" 2>&1 < /dev/null &
bootstrap_pid=$!
printf '%s\n' "$bootstrap_pid" > "$SYSTEM_PID_FILE"

for _ in $(seq 1 36); do
  if ss -ltn | grep -q ":$SYSTEM_PORT " && \
     grep -Eq 'keyspaceName=SYSTEM|server is running' "$SYSTEM_LOG_FILE"; then
    log "SYSTEM bootstrap listener is up"
    break
  fi
  if ! kill -0 "$bootstrap_pid" 2>/dev/null; then
    tail -n 80 "$SYSTEM_LOG_FILE"
    exit 1
  fi
  sleep 5
done

if ! ss -ltn | grep -q ":$SYSTEM_PORT " || \
   ! grep -Eq 'keyspaceName=SYSTEM|server is running' "$SYSTEM_LOG_FILE"; then
  tail -n 80 "$SYSTEM_LOG_FILE"
  exit 1
fi

stop_bootstrap
log "SYSTEM bootstrap process stopped; wait for normal TiDB retry and run tiup cluster display"
