#!/usr/bin/env bash
# JV 生データ取得の進捗を10分ごとに記録（cron 用）
#
# 例:
#   */10 * * * * /var/www/html/tools.kachiumaai.com/scripts/jv_fetch_monitor.sh
#
set -euo pipefail

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
LOG_DIR="${ROOT}/logs"
mkdir -p "$LOG_DIR"
LOG="${LOG_DIR}/jv_fetch_monitor.log"
STAMP="$(TZ=Asia/Tokyo date '+%F %T')"

log() {
  echo "[${STAMP}] $*" >>"$LOG"
}

RAW=$(mysql keiba_ai -N -e "SELECT COUNT(*) FROM jv_raw_records;" 2>/dev/null || echo "?")
MINMAX=$(mysql keiba_ai -N -e "SELECT MIN(id), MAX(id) FROM jv_raw_records;" 2>/dev/null || echo "? ?")

if pgrep -f "jv_fetch_years_raw_only.sh" >/dev/null 2>&1; then
  FETCH_STATE="running(jv_fetch_years_raw_only)"
elif pgrep -f "jv_wait_tunnel_and_fetch_raw" >/dev/null 2>&1; then
  FETCH_STATE="waiting_tunnel"
elif pgrep -f "collectors/fetch_jv_raw.py" >/dev/null 2>&1; then
  FETCH_STATE="running(fetch_jv_raw)"
else
  FETCH_STATE="idle"
fi

TAIL_LOG=""
LATEST=$(ls -t "${LOG_DIR}"/jv_fetch_2020_to_now.*.log "${LOG_DIR}"/jv_fetch_from_jvan.*.log 2>/dev/null | head -1 || true)
if [[ -n "$LATEST" ]]; then
  TAIL_LOG=$(tail -1 "$LATEST" 2>/dev/null | tr -d '\r' || true)
fi

DISK=$(df -h / | awk 'NR==2 {print $3"/"$2" "$5}')

log "raw_count=${RAW} id_range=${MINMAX} fetch=${FETCH_STATE} disk=${DISK} last_log=${TAIL_LOG}"

# 1時間に1回・件数が少ないときだけ meet_year 集計（重い）
MARKER="${LOG_DIR}/.jv_fetch_monitor_year_hour"
HOUR_KEY="$(TZ=Asia/Tokyo date +%Y%m%d%H)"
if [[ "${RAW}" != "?" ]] && [[ "${RAW}" -lt 500000 ]] \
  && { [[ ! -f "$MARKER" ]] || [[ "$(cat "$MARKER" 2>/dev/null)" != "$HOUR_KEY" ]]; }; then
  echo "$HOUR_KEY" >"$MARKER"
  timeout 120 mysql keiba_ai -N -e "
    SELECT CONCAT('meet_year=', JSON_UNQUOTE(JSON_EXTRACT(payload_json,'$.meet_year')),
                  ' count=', COUNT(*))
    FROM jv_raw_records
    GROUP BY JSON_UNQUOTE(JSON_EXTRACT(payload_json,'$.meet_year'))
    ORDER BY 1;
  " 2>/dev/null | while read -r line; do
    log "  ${line}"
  done || log "  meet_year breakdown skipped (timeout or error)"
fi

# phase2 が止まっていたら自動再開（checkpoint の重い RA 集計で落ちる等の対策）
RESUME_MARKER="${LOG_DIR}/.jv_fetch_auto_resume_ts"
RESUME_COOLDOWN_SEC="${JV_FETCH_RESUME_COOLDOWN_SEC:-600}"
TO_YEAR="${JV_BACKFILL_TO_YEAR:-2026}"

if [[ "${FETCH_STATE}" == "idle" ]] && [[ -n "${LATEST:-}" ]]; then
  if ! grep -q "=== DONE" "${LATEST}" 2>/dev/null; then
    now_ts=$(date +%s)
    last_ts=0
    [[ -f "${RESUME_MARKER}" ]] && last_ts=$(cat "${RESUME_MARKER}" 2>/dev/null || echo 0)
    if (( now_ts - last_ts >= RESUME_COOLDOWN_SEC )); then
      resume_year=""
      if grep -q "checkpoint:" "${LATEST}" 2>/dev/null; then
        last_done=$(grep "checkpoint:" "${LATEST}" | tail -1 | sed -n 's/.*year \([0-9]\{4\}\) checkpoint.*/\1/p')
        [[ -n "${last_done}" ]] && resume_year=$((10#${last_done} + 1))
      else
        resume_year=$(grep "year 20[0-9][0-9]: RACE setup" "${LATEST}" | tail -1 | sed -n 's/.*year \([0-9]\{4\}\): RACE setup.*/\1/p')
        if [[ -n "${resume_year}" ]] && grep -q "year ${resume_year} checkpoint:" "${LATEST}" 2>/dev/null; then
          resume_year=$((10#${resume_year} + 1))
        fi
      fi
      if [[ -n "${resume_year}" ]] && (( resume_year <= TO_YEAR )); then
        PY=(python3.11)
        command -v "${PY[0]}" &>/dev/null || PY=(python3)
        if "${PY[@]}" scripts/jv_link_tcp_healthcheck.py >/dev/null 2>&1; then
          echo "${now_ts}" >"${RESUME_MARKER}"
          rm -f "${ROOT}/logs/.jv_fetch_2020_to_now.lock"
          log "AUTO_RESUME: idle+incomplete → JV_BACKFILL_FROM_YEAR=${resume_year} phase2 restart"
          nohup env JV_SKIP_ALL_STORED=1 JV_BACKFILL_FROM_YEAR="${resume_year}" JV_BACKFILL_TO_YEAR="${TO_YEAR}" \
            "${ROOT}/scripts/jv_wait_tunnel_and_fetch_raw.sh" >>"${LOG_DIR}/jv_wait_fetch.nohup.log" 2>&1 &
        else
          log "AUTO_RESUME: skipped (tunnel down)"
        fi
      fi
    fi
  fi
fi
