#!/usr/bin/env bash
# 1年分だけ取得 → 増分正規化 → races 件数確認（JRA 中央競馬は年約3400前後）
#
#   ./scripts/jv_fetch_one_year.sh 2020
#
set -euo pipefail

YEAR="${1:?usage: jv_fetch_one_year.sh YYYY}"
TARGET_RACES="${JV_YEAR_TARGET_RACES:-3400}"

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
# shellcheck source=/dev/null
source "${ROOT}/scripts/jv_load_env.sh"
cd "$ROOT"
export PYTHONPATH="${ROOT}${PYTHONPATH:+:$PYTHONPATH}"

LOG_DIR="${ROOT}/logs"
mkdir -p "$LOG_DIR"
STAMP="$(TZ=Asia/Tokyo date +%Y%m%d_%H%M%S)"
LOG="${LOG_DIR}/jv_fetch_one_year_${YEAR}.${STAMP}.log"
PY=(python3.11)
command -v "${PY[0]}" &>/dev/null || PY=(python3)
EXTRA=()
if [[ -n "${JV_FETCH_EXTRA:-}" ]]; then
  # shellcheck disable=SC2206
  EXTRA=(${JV_FETCH_EXTRA})
fi
HOST="${JVLINK_SERVER_HOST:-127.0.0.1}"
PORT="${JVLINK_SERVER_PORT:-8765}"
# JRA-VAN setup: pyjvlink は from/to を別引数で渡し、内部で「from-to」レンジを組み立てる。
# 8桁 YYYYMMDD が通る（14桁レンジを from_datetime に直書きすると pyjvlink が拒否する）。
FROM_DT="${YEAR}0101"
NEXT=$((YEAR + 1))
TO_DT="${YEAR}1231"
TO_NEXT="${NEXT}0101"
BUSY_R="${JV_BUSY_RETRIES:-60}"
BUSY_S="${JV_BUSY_SLEEP_SEC:-30}"

log() {
  echo "[$(TZ=Asia/Tokyo date '+%F %T')] $*" | tee -a "$LOG"
}

ra_raw_year() {
  timeout 120 mysql keiba_ai -N -e \
    "SELECT COUNT(*) FROM jv_raw_records WHERE record_type='RA' AND payload_json LIKE '%\"meet_year\": \"${YEAR}\"%';" \
    2>/dev/null || echo "?"
}

races_jra_year() {
  mysql keiba_ai -N -e \
    "SELECT COUNT(*) FROM races WHERE circuit='JRA' AND YEAR(race_date)=${YEAR};" 2>/dev/null || echo "?"
}

try_fetch() {
  local label="$1"
  shift
  log "FETCH try: ${label}"
  if "${PY[@]}" collectors/fetch_jv_raw.py \
    "${EXTRA[@]}" --host "$HOST" --port "$PORT" \
    --busy-retries "$BUSY_R" --busy-sleep "$BUSY_S" \
    "$@" >>"$LOG" 2>&1; then
    log "FETCH ok: ${label}"
    return 0
  fi
  log "FETCH fail: ${label}"
  return 1
}

log "=== one year ${YEAR} target_races~${TARGET_RACES} log=${LOG} ==="

if ! "${PY[@]}" scripts/jv_link_tcp_healthcheck.py >>"$LOG" 2>&1; then
  log "ERROR: tunnel NG — Windows: JVLinkServer + step01"
  exit 2
fi

ID_BEFORE=$(mysql keiba_ai -N -e "SELECT COALESCE(MAX(id),0) FROM jv_raw_records;")
RACES_B=$(races_jra_year)
RA_B=$(ra_raw_year)
log "before: max_id=${ID_BEFORE} races_jra_${YEAR}=${RACES_B} ra_raw_${YEAR}=${RA_B}"

# setup(option=3/4) … 8桁 from/to。option=3 が通る環境あり（jv_open は数分〜長時間かかる）。
if ! try_fetch "setup3_yearend" --from-datetime "$FROM_DT" --to-date "$TO_DT" --dataspec RACE --option 3; then
  if ! try_fetch "setup3_nextyear" --from-datetime "$FROM_DT" --to-date "$TO_NEXT" --dataspec RACE --option 3; then
    if ! try_fetch "setup4_yearend" --from-datetime "$FROM_DT" --to-date "$TO_DT" --dataspec RACE --option 4; then
      try_fetch "accum1" --from-datetime "$FROM_DT" --dataspec RACE --option 1 || true
    fi
  fi
fi

RA_M=$(ra_raw_year)
ADDED=$(( $(mysql keiba_ai -N -e "SELECT COUNT(*) FROM jv_raw_records;") - $(mysql keiba_ai -N -e "SELECT COUNT(*) FROM jv_raw_records WHERE id<=${ID_BEFORE};" 2>/dev/null || echo "$ID_BEFORE") ))
log "after fetch: ra_raw_${YEAR}=${RA_M} (was ${RA_B}) raw_added~${ADDED}"

log "NORMALIZE from-id=$((ID_BEFORE + 1))"
"${PY[@]}" collectors/normalize_jv_raw.py --from-id "$((ID_BEFORE + 1))" --batch-size 5000 >>"$LOG" 2>&1

RACES_A=$(races_jra_year)
log "after normalize: races_jra_${YEAR}=${RACES_A} (was ${RACES_B}) delta=$((RACES_A - RACES_B))"

if (( RACES_A >= TARGET_RACES )); then
  log "OK ${YEAR}: races >= ${TARGET_RACES}"
  exit 0
fi
log "WARN ${YEAR}: races=${RACES_A} < target~${TARGET_RACES} — setup 失敗 or JV busy の可能性"
exit 1
