#!/usr/bin/env bash
# 指定年（既定 2019）〜終了年まで JV を年単位で取得し、最後に正規化・展開・監査する。
# 過去年の RA/SE は option=1（更新日差分）では足りないため、RACE は setup(option=4)+to-date を使う。
#
# 例:
#   ./scripts/jv_backfill_years.sh
#   JV_BACKFILL_FROM_YEAR=2019 JV_BACKFILL_TO_YEAR=2025 ./scripts/jv_backfill_years.sh
#   JV_SKIP_FETCH=1 ./scripts/jv_backfill_years.sh   # 取得スキップ（正規化のみ）
#
set -euo pipefail

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_backfill_years.${STAMP}.log"

PY=(python3.11)
command -v "${PY[0]}" &>/dev/null || PY=(python3)

FROM_YEAR="${JV_BACKFILL_FROM_YEAR:-2019}"
TO_YEAR="${JV_BACKFILL_TO_YEAR:-$(TZ=Asia/Tokyo date +%Y)}"
SETUP_OPTION="${JV_SETUP_OPTION:-4}"
HOST="${JVLINK_SERVER_HOST:-127.0.0.1}"
PORT="${JVLINK_SERVER_PORT:-8765}"
EXTRA_FETCH=()
if [[ -n "${JV_FETCH_EXTRA:-}" ]]; then
  # shellcheck disable=SC2206
  EXTRA_FETCH=(${JV_FETCH_EXTRA})
fi

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

log "=== JV backfill ${FROM_YEAR}..${TO_YEAR} host=${HOST}:${PORT} log=${LOG} ==="

if [[ "${JV_SKIP_FETCH:-0}" != "1" ]]; then
  if ! "${PY[@]}" scripts/jv_link_tcp_healthcheck.py >>"$LOG" 2>&1; then
    log "ERROR: JV-Link 未接続。JVLinkServer 起動後に再実行してください。"
    log "  docs/ops_jv_link_windows_fetch.md"
    exit 2
  fi

  for ((y = FROM_YEAR; y <= TO_YEAR; y++)); do
    FROM_DT="${y}0101"
    if (( y == FROM_YEAR )); then
      ODDS_FROM="${y}0101"
    else
      prev=$((y - 1))
      ODDS_FROM="${prev}1201"
    fi

    log "--- FETCH year ${y}: RACE from ${FROM_DT} option=1 ---"

    if ! "${PY[@]}" collectors/fetch_jv_raw.py \
      "${EXTRA_FETCH[@]}" --host "$HOST" --port "$PORT" \
      --from-datetime "$FROM_DT" --dataspec RACE --option 1 \
      --busy-retries "${JV_BUSY_RETRIES:-30}" --busy-sleep "${JV_BUSY_SLEEP_SEC:-20}" \
      >>"$LOG" 2>&1; then
      log "WARN: RACE fetch failed year=${y}"
    fi
    sleep "${JV_BETWEEN_FETCH_SEC:-5}"

    if (( y == TO_YEAR )); then
      log "--- FETCH year ${y}: weekly-odds from ${ODDS_FROM} (current year only) ---"
      if ! "${PY[@]}" collectors/fetch_jv_raw.py \
        "${EXTRA_FETCH[@]}" --host "$HOST" --port "$PORT" \
        --from-datetime "$ODDS_FROM" --weekly-odds \
        >>"$LOG" 2>&1; then
        log "WARN: weekly-odds fetch failed year=${y}"
      fi
      sleep "${JV_BETWEEN_FETCH_SEC:-5}"
    fi
  done
else
  log "JV_SKIP_FETCH=1: fetch phase skipped"
fi

log "--- NORMALIZE (from-id=${JV_NORMALIZE_FROM_ID:-0}) ---"
"${PY[@]}" collectors/normalize_jv_raw.py \
  --from-id "${JV_NORMALIZE_FROM_ID:-0}" \
  --batch-size "${JV_NORMALIZE_BATCH:-2000}" \
  >>"$LOG" 2>&1

log "--- MATERIALIZE ---"
"${PY[@]}" collectors/materialize_jv_app_records.py >>"$LOG" 2>&1

log "--- AUDIT ---"
"${PY[@]}" scripts/audit_data_coverage.py --from-year "$FROM_YEAR" --to-year "$TO_YEAR" | tee -a "$LOG"

log "=== finished. 次: import p6 → scripts/backfill_data_and_repredict.sh repredict-p6 ==="

if [[ -x "${ROOT}/scripts/jv_prune_logs.sh" ]]; then
  JV_LOG_MIN_AGE_HOURS=1 bash "${ROOT}/scripts/jv_prune_logs.sh" >>"$LOG" 2>&1 || true
fi
