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

# ------ -------------------------- ------------ ---------- ------
# run_full_test.sh
# full functional periodic 실행 entrypoint
#
# run_test_by_change.sh --route full --dry-run 분류 결과를 확인하고,
# recommended 상태의 full functional 후보를 run_matrix.sh --all로 실행한다.
# nightly-pending 후보는 별도 기록만 하고 실행하지 않는다.
# ------ -------------------------- ------------ ---------- ------

usage() {
  cat <<'USAGE'
Usage: run_full_test.sh [--dry-run] [--skip-network]

full functional periodic test runner.
분류 결과를 확인하고 실행 또는 dry-run을 출력한다.

Options:
  --dry-run        분류 결과만 출력하고 실제 테스트 실행하지 않음
  --skip-network   크로스테스트/웹 테스트 건너뛰고 unit/proto만 실행
  -h, --help       이 도움말 출력
USAGE
}

dry_run=0
skip_network=0

while [ "$#" -gt 0 ]; do
  case "$1" in
    --dry-run)       dry_run=1 ;;
    --skip-network)  skip_network=1 ;;
    -h|--help)       usage; exit 0 ;;
    *)
      printf 'Error: unknown option "%s"\n' "$1" >&2
      usage >&2
      exit 2
      ;;
  esac
  shift
done

script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
repo_root="$(cd "$script_dir/../../../../.." && pwd)"
classifier="$script_dir/run_test_by_change.sh"
matrix="$script_dir/run_matrix.sh"

# 1. classifier 실행
printf '## Classifier\n\n'
classify_output="$(bash "$classifier" --route full --dry-run 2>&1)"
classify_exit=$?
printf '%s\n' "$classify_output"

if [ "$classify_exit" -ne 0 ]; then
  printf '\n**ERROR** classifier 실패 (exit %d)\n' "$classify_exit" >&2
  exit "$classify_exit"
fi

# recommended 상태의 full functional 후보 확인
has_recommended=0
if printf '%s\n' "$classify_output" | grep -q '| recommended | functional-full '; then
  has_recommended=1
fi

# nightly-pending 항목 리포트 (미실행, PASS 아님)
report_nightly_pending() {
  local rows
  rows="$(printf '%s\n' "$classify_output" | grep '| nightly-pending |' || true)"
  [ -z "$rows" ] && return

  printf '\n### Nightly pending (미실행, PASS 아님)\n\n'
  printf '다음 항목은 실행하지 않았으며 PASS 근거가 아닙니다. 20:00 이후 별도 실행 후보:\n\n'
  while IFS= read -r row; do
    [ -z "$row" ] && continue
    local kind
    kind="$(printf '%s\n' "$row" | awk -F'|' '{s=$3; gsub(/^ +| +$/, "", s); print s; exit}')"
    local cmd
    case "$kind" in
      performance-full)
        cmd="bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh --full"
        ;;
      stability-full)
        cmd="bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --full --profile sustained,parallel,payload"
        ;;
      *)
        cmd="manual follow-up required"
        ;;
    esac
    printf -- '- %s: `%s`\n' "$kind" "$cmd"
  done <<< "$rows"
}

if [ "$dry_run" -eq 1 ]; then
  echo "### Dry-run 완료"
  if [ "$has_recommended" -eq 1 ]; then
    echo "full functional recommended — 실제 실행하려면 --dry-run 옵션을 제거하라."
  else
    echo "full functional 미권장 — 실행하지 않음."
  fi
  report_nightly_pending
  exit 0
fi

# 2. recommended 상태 확인 — functional-full 추천 없으면 matrix 실행skip
if [ "$has_recommended" -ne 1 ]; then
  printf '\n**SKIPPED** full functional 미권장 — classifier가 functional-full을 추천하지 않아 matrix를 실행하지 않음.\n\n'
  exit 0
fi

# 3. matrix 실행
if [ "$skip_network" -eq 1 ]; then
  printf '\n## Matrix (unit + proto only)\n\n'
  bash "$matrix" --unit --proto
else
  printf '\n## Matrix (full)\n\n'
  bash "$matrix" --all
fi
matrix_exit=$?

printf '\n## 결과\n\n'
if [ "$matrix_exit" -eq 0 ]; then
  printf 'full functional periodic: **PASS**\n'
else
  printf 'full functional periodic: **FAIL** (exit %d)\n' "$matrix_exit"
fi
report_nightly_pending

exit "$matrix_exit"
