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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SEED_FILE="${ROOT_DIR}/deployments/offline/runtime/seeds/exp-baseline.seed.yaml"
ENV_FILE=""
OUTPUT_DIR=""
STATE_FILE=""
SUMMARY_FILE=""
OBJECTS="${EXP_BULK_BASELINE_OBJECTS:-}"
RECORD_KEYS=""
DRY_RUN=0
SELECTED_ONLY=0
MAX_WORKERS="${EXP_BULK_BASELINE_MAX_WORKERS:-4}"

usage() {
  cat <<'EOF'
Usage:
  scripts/apply_exp_bulk_baseline.sh [--env-file path] [--seed-file path] [--output-dir path] [--state-file path] [--summary-file path] [--objects A,B,C] [--record-keys key-a,key-b] [--selected-only] [--max-workers n] [--dry-run]

Purpose:
  Apply bulk-eligible seed records directly to TiDB and write a runtime seed
  state file for downstream evidence and adapter normalization.
EOF
}

python_seed_deps_dir() {
  local seed_deps_dir="${PYTHON_SEED_DEPS_DIR:-${ROOT_DIR}/.runtime/python-seed-deps}"
  mkdir -p "${seed_deps_dir}"
  printf '%s\n' "${seed_deps_dir}"
}

run_python_with_seed_deps() {
  local import_check="$1"
  shift
  local packages=()
  local uv_packages=()

  while [[ "$#" -gt 0 && "$1" != "--" ]]; do
    packages+=("$1")
    uv_packages+=(--with "$1")
    shift
  done
  if [[ "$#" -eq 0 ]]; then
    echo "internal error: missing -- before python arguments" >&2
    return 2
  fi
  shift

  if python3 -c "${import_check}" >/dev/null 2>&1; then
    python3 "$@"
    return $?
  fi

  if command -v uv >/dev/null 2>&1; then
    uv run "${uv_packages[@]}" python "$@"
    return $?
  fi

  local seed_deps_dir
  seed_deps_dir="$(python_seed_deps_dir)"
  if PYTHONPATH="${seed_deps_dir}${PYTHONPATH:+:${PYTHONPATH}}" python3 -c "${import_check}" >/dev/null 2>&1; then
    PYTHONPATH="${seed_deps_dir}${PYTHONPATH:+:${PYTHONPATH}}" python3 "$@"
    return $?
  fi

  if ! python3 -m pip --version >/dev/null 2>&1; then
    echo "[exp-bulk-seed] missing Python dependency installer: install pip for $(command -v python3) or install uv" >&2
    return 1
  fi

  echo "[exp-bulk-seed] installing Python seed dependencies into ${seed_deps_dir}" >&2
  python3 -m pip install --quiet --disable-pip-version-check --upgrade --target "${seed_deps_dir}" "${packages[@]}"
  PYTHONPATH="${seed_deps_dir}${PYTHONPATH:+:${PYTHONPATH}}" python3 "$@"
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --env-file)
      ENV_FILE="${2:-}"
      shift 2
      ;;
    --seed-file)
      SEED_FILE="${2:-}"
      shift 2
      ;;
    --output-dir)
      OUTPUT_DIR="${2:-}"
      shift 2
      ;;
    --state-file)
      STATE_FILE="${2:-}"
      shift 2
      ;;
    --summary-file)
      SUMMARY_FILE="${2:-}"
      shift 2
      ;;
    --objects)
      OBJECTS="${2:-}"
      shift 2
      ;;
    --record-keys)
      RECORD_KEYS="${2:-}"
      shift 2
      ;;
    --selected-only)
      SELECTED_ONLY=1
      shift
      ;;
    --max-workers)
      MAX_WORKERS="${2:-}"
      shift 2
      ;;
    --dry-run)
      DRY_RUN=1
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "unknown argument: $1" >&2
      usage >&2
      exit 2
      ;;
  esac
done

if [[ "${SEED_FILE}" != /* ]]; then
  SEED_FILE="${ROOT_DIR}/${SEED_FILE#./}"
fi
if [[ ! -f "${SEED_FILE}" ]]; then
  echo "seed file not found: ${SEED_FILE}" >&2
  exit 1
fi

if [[ -n "${ENV_FILE}" ]]; then
  if [[ "${ENV_FILE}" != /* ]]; then
    ENV_FILE="${ROOT_DIR}/${ENV_FILE#./}"
  fi
  if [[ ! -f "${ENV_FILE}" ]]; then
    echo "env file not found: ${ENV_FILE}" >&2
    exit 1
  fi
  set -a
  # shellcheck disable=SC1090
  source "${ENV_FILE}"
  set +a
fi

if [[ -z "${OUTPUT_DIR}" ]]; then
  OUTPUT_DIR="$(mktemp -d -t exp-bulk-baseline.XXXXXX)"
else
  mkdir -p "${OUTPUT_DIR}"
fi
if [[ "${OUTPUT_DIR}" != /* ]]; then
  OUTPUT_DIR="${ROOT_DIR}/${OUTPUT_DIR#./}"
fi

if [[ -z "${STATE_FILE}" ]]; then
  STATE_FILE="${OUTPUT_DIR}/runtime-state.json"
elif [[ "${STATE_FILE}" != /* ]]; then
  STATE_FILE="${ROOT_DIR}/${STATE_FILE#./}"
fi

if [[ -z "${SUMMARY_FILE}" ]]; then
  SUMMARY_FILE="${OUTPUT_DIR}/summary.json"
elif [[ "${SUMMARY_FILE}" != /* ]]; then
  SUMMARY_FILE="${ROOT_DIR}/${SUMMARY_FILE#./}"
fi

echo "[exp-bulk-seed] seed_file=${SEED_FILE}"
echo "[exp-bulk-seed] output_dir=${OUTPUT_DIR}"
echo "[exp-bulk-seed] state_file=${STATE_FILE}"
echo "[exp-bulk-seed] summary_file=${SUMMARY_FILE}"
if [[ -n "${OBJECTS}" ]]; then
  echo "[exp-bulk-seed] objects=${OBJECTS}"
fi
if [[ -n "${RECORD_KEYS}" ]]; then
  echo "[exp-bulk-seed] record_keys=${RECORD_KEYS}"
fi

args=(
  "${ROOT_DIR}/scripts/apply_exp_bulk_baseline.py"
  --seed-file "${SEED_FILE}"
  --state-file "${STATE_FILE}"
  --summary-file "${SUMMARY_FILE}"
  --max-workers "${MAX_WORKERS}"
)
if [[ -n "${OBJECTS}" ]]; then
  args+=(--objects "${OBJECTS}")
fi
if [[ -n "${RECORD_KEYS}" ]]; then
  args+=(--record-keys "${RECORD_KEYS}")
fi
if [[ "${SELECTED_ONLY}" == "1" ]]; then
  args+=(--selected-only)
fi
if [[ "${DRY_RUN}" == "1" ]]; then
  args+=(--dry-run)
fi

if [[ "${DRY_RUN}" == "1" ]]; then
  import_check='import yaml'
  packages=(pyyaml)
else
  import_check='import pymysql, yaml'
  packages=(pymysql pyyaml)
fi

run_python_with_seed_deps "${import_check}" "${packages[@]}" -- "${args[@]}"
