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

# Сборка apidoc по whitelist-каталогам (без обхода всего репозитория).
# Нужна, чтобы apidoc не пытался stat() битые симлинки/логи в errors/ и не парсил служебные каталоги.

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

SCAN_ROOT="$REPO_ROOT"
OUT_DIR="./apidoc"
APIDOC_BIN="apidoc"
LOG_CMD="0"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --scan-root)
      SCAN_ROOT="${2:?missing value for --scan-root}"
      shift 2
      ;;
    --out-dir)
      OUT_DIR="${2:?missing value for --out-dir}"
      shift 2
      ;;
    --apidoc-bin)
      APIDOC_BIN="${2:?missing value for --apidoc-bin}"
      shift 2
      ;;
    --log-command)
      LOG_CMD="1"
      shift 1
      ;;
    *)
      echo "[build-apidoc] unknown arg: $1" >&2
      exit 2
      ;;
  esac
done

if [[ "$APIDOC_BIN" == "apidoc" ]]; then
  if ! command -v apidoc >/dev/null 2>&1; then
    if [[ -x "$REPO_ROOT/node_modules/.bin/apidoc" ]]; then
      APIDOC_BIN="$REPO_ROOT/node_modules/.bin/apidoc"
    fi
  fi
fi

if ! command -v "$APIDOC_BIN" >/dev/null 2>&1; then
  echo "[build-apidoc] apidoc not found (bin: $APIDOC_BIN). Установите зависимости node или добавьте apidoc в PATH." >&2
  exit 127
fi

if command -v php >/dev/null 2>&1; then
  php generate-apidoc.php
else
  echo "[build-apidoc] php not found, skipping generate-apidoc.php" >&2
fi

# Удалить битые симлинки в errors/ (предотвращает ENOENT при обходе директорий).
find ./errors -xtype l -delete 2>/dev/null || true

# Локальная сборка: не сканируем корень, чтобы не задеть runtime-каталоги (errors/, logs/, storage/).
# Для включения root-endpoints копируем их в отдельную директорию и добавляем её как input.
inputs=()
if [[ "$SCAN_ROOT" == "$REPO_ROOT" ]]; then
  APIDOC_ROOT_INPUT_DIR=".apidoc-input/root"
  mkdir -p "$APIDOC_ROOT_INPUT_DIR"
  for f in admin.php check_products.php version.php sync.php; do
    if [[ -f "$f" ]]; then
      cp -f "$f" "$APIDOC_ROOT_INPUT_DIR/$f"
    fi
  done
  inputs=(src products clients brands sections storetypes pricetypes order deliverypoint discounts managers properties rest1c ".apidoc-input")
else
  # CI/деплой: можно сканировать export из git archive целиком (в нём нет runtime-каталогов).
  inputs=("$SCAN_ROOT")
fi

cmd=("$APIDOC_BIN"
  -o "$OUT_DIR"
  -f '.*\.(php|js|ts)$'
  -e '(^|/)(errors|node_modules|vendor|storage|\.git|\.serena|apidoc|tools|tests|docs|scripts|systemd|changes|logs|notes|off|bin)(/|$)'
  -e '.*\.log$')

for d in "${inputs[@]}"; do
  [[ -e "$d" ]] || continue
  if [[ "$d" == /* ]]; then
    cmd+=(-i "$d")
  else
    cmd+=(-i "./$d")
  fi
done

if [[ "$LOG_CMD" == "1" ]]; then
  echo "Running apidoc: ${cmd[*]}"
fi

"${cmd[@]}"
