#!/usr/bin/env bash
# Retrain 6H, 12H, 1D with robust fold objective then sweep and promote.
# Runs 3 parallel training batches (one per TF) per seed round, then sweeps.
# Usage: bash tools/retrain_6H_12H_1D.sh [--seeds "101 202 303"] [--es-workers 4]
#        Logs to /tmp/retrain_progress.log  (tail -f to watch)

set -euo pipefail

REPO="$(cd "$(dirname "$0")/.." && pwd)"
LOG=/tmp/retrain_progress.log
VENV="$REPO/.venv/bin/python3"

SEEDS=(101 202 303)
ES_WORKERS=4

for arg in "$@"; do
  case "$arg" in
    --seeds) shift; IFS=' ' read -r -a SEEDS <<< "$1"; shift ;;
    --es-workers) shift; ES_WORKERS="$1"; shift ;;
  esac
done

log() { echo "[$(date -u +%H:%M:%S)] $*" | tee -a "$LOG"; }
separator() { echo "────────────────────────────────────────" | tee -a "$LOG"; }

cd "$REPO"

log "Retrain 6H / 12H / 1D  seeds=(${SEEDS[*]})  es-workers=$ES_WORKERS"
separator

# ── Seed rounds ───────────────────────────────────────────────────────────────
# 6H seed101 already exists; start 6H from seed202 in round 1.

for SEED in "${SEEDS[@]}"; do
  # 6H: skip seed101 (artifact exists), run all others
  TF_6H_SKIP=0
  if [[ "$SEED" == "101" ]]; then
    TF_6H_SKIP=1
    log "6H seed101 artifact exists — skipping, will include as extra-weight in sweep"
  fi

  log "Starting seed $SEED batch"

  PIDS=()

  if [[ "$TF_6H_SKIP" == "0" ]]; then
    OUT_6H="$REPO/strategies/params/mlp/mlp_weights_COINBASE_BTCUSD_6H_robust_seed${SEED}.json"
    log "  Launching 6H seed$SEED → $OUT_6H"
    "$VENV" tools/train_mlp.py \
      --data data/COINBASE_BTCUSD-6H.csv \
      --fold-objective robust --l2 0.01 --es-workers "$ES_WORKERS" \
      --seed "$SEED" --out "$OUT_6H" \
      > "/tmp/train_6H_seed${SEED}.log" 2>&1 &
    PIDS+=($!)
  fi

  OUT_12H="$REPO/strategies/params/mlp/mlp_weights_COINBASE_BTCUSD_12H_robust_seed${SEED}.json"
  log "  Launching 12H seed$SEED → $OUT_12H"
  "$VENV" tools/train_mlp.py \
    --data data/COINBASE_BTCUSD-12H.csv \
    --fold-objective robust --l2 0.01 --es-workers "$ES_WORKERS" \
    --seed "$SEED" --out "$OUT_12H" \
    > "/tmp/train_12H_seed${SEED}.log" 2>&1 &
  PIDS+=($!)

  OUT_1D="$REPO/strategies/params/mlp/mlp_weights_COINBASE_BTCUSD_1D_robust_seed${SEED}.json"
  log "  Launching 1D seed$SEED → $OUT_1D"
  "$VENV" tools/train_mlp.py \
    --data data/COINBASE_BTCUSD-1D.csv \
    --fold-objective robust --l2 0.01 --es-workers "$ES_WORKERS" \
    --seed "$SEED" --out "$OUT_1D" \
    > "/tmp/train_1D_seed${SEED}.log" 2>&1 &
  PIDS+=($!)

  for PID in "${PIDS[@]}"; do wait "$PID" && log "  pid $PID done" || log "  pid $PID FAILED"; done
  log "Seed $SEED batch complete"
  separator
done

log "All training done. Starting sweeps."
separator

# ── Helper: collect robust artifacts for a TF ─────────────────────────────────
extra_weights_for() {
  local tf="$1"
  local files=()
  for f in "$REPO/strategies/params/mlp/mlp_weights_COINBASE_BTCUSD_${tf}_robust_seed"*.json; do
    [[ -f "$f" ]] && files+=("$f")
  done
  echo "${files[@]:-}"
}

# ── Sweep each TF with all its robust artifacts ───────────────────────────────
for TF in 6H 12H 1D; do
  EXTRAS=$(extra_weights_for "$TF")
  if [[ -z "$EXTRAS" ]]; then
    log "  $TF: no robust artifacts found, sweeping with canonical weights only"
    "$VENV" tools/run_mlp_deep_sweep.py \
      --timeframes "$TF" --samples 50000 --promote \
      > "/tmp/sweep_${TF}.log" 2>&1
  else
    log "  $TF: sweeping with artifacts: $EXTRAS"
    # shellcheck disable=SC2086
    "$VENV" tools/run_mlp_deep_sweep.py \
      --timeframes "$TF" --samples 50000 --promote \
      --extra-weights $EXTRAS \
      > "/tmp/sweep_${TF}.log" 2>&1
  fi
  log "  $TF sweep done"
done

separator
log "Updating Pine MLP presets"
"$VENV" tools/generate_pine_mlp_presets.py >> "$LOG" 2>&1
log "Pine presets updated"

separator
log "Running regression table"
"$VENV" tools/mlp_results_table.py 2>&1 | tee -a "$LOG"

separator
log "Sending push notification"
"$VENV" tools/ntfy.py \
  "6H/12H/1D robust retrain done. Seeds: ${SEEDS[*]}. Check /tmp/retrain_progress.log" \
  --title "MLP Retrain Complete" --priority high || true

log "ALL DONE"
