#!/usr/bin/env bash
# Run after pasting strategy_mlp_scores.pine to TradingView and re-exporting
# the BTC/USD 8H chart data to ~/Downloads/COINBASE_BTCUSD, 480.csv
set -euo pipefail

REPO="$(cd "$(dirname "$0")" && pwd)"
DATA="${1:-$REPO/data/mlp/COINBASE_BTCUSD, 480.csv}"
PARAMS="$REPO/results/winners/optimization_winner_strategy_mlp_scores_COINBASE_BTCUSD_8H.csv"
PYTHON="$REPO/.venv/bin/python"
TV_TRADES="${2:-$(find "$REPO/data/mlp" -maxdepth 1 -type f -name 'MLPScores_COINBASE_BTCUSD_*8h.csv' -print | sort | tail -1)}"
WEIGHTS=$("$PYTHON" - "$PARAMS" <<'PYEOF'
import sys
import pandas as pd
print(pd.read_csv(sys.argv[1]).iloc[0]['mlp_weights_file'])
PYEOF
)

echo "=== 8H MLP Parity Verification ==="
echo "Data:    $DATA"
echo "Weights: $WEIGHTS"
echo ""

# Check the data file has the new feature columns
MISSING=$("$PYTHON" - "$DATA" "$WEIGHTS" <<'PYEOF'
import json
import sys

import pandas as pd

df = pd.read_csv(sys.argv[1], nrows=2)
df.columns = df.columns.str.lower().str.strip()
with open(sys.argv[2]) as handle:
    art = json.load(handle)

missing = [c for c in set(art['feature_cols']) if c not in df.columns]
print('\n'.join(sorted(missing)))
PYEOF
)

if [ -n "$MISSING" ]; then
  echo "❌ Data file is still missing feature columns:"
  echo "$MISSING" | sed 's/^/   /'
  echo ""
  echo "→ Paste strategies/strategy_mlp_scores.pine to TradingView, then re-export."
  exit 1
fi

echo "✅ All required feature columns present in data file."
echo ""

# Require the minimal trailing diagnostics and summarize every Pine stop hit.
"$PYTHON" - "$DATA" "$PARAMS" <<'PYEOF'
import sys

import pandas as pd

df = pd.read_csv(sys.argv[1])
params = pd.read_csv(sys.argv[2]).iloc[0]
df.columns = df.columns.str.lower().str.strip()
required = {'trail_stop_price_ratio', 'trail_high_price_ratio'}
missing = sorted(required - set(df.columns))
if missing:
    raise SystemExit(f"Missing trailing diagnostics: {', '.join(missing)}")

df['time'] = pd.to_datetime(df['time'], utc=True)
stop_ratio = pd.to_numeric(df['trail_stop_price_ratio'], errors='coerce')
high_ratio = pd.to_numeric(df['trail_high_price_ratio'], errors='coerce')
trail_factor = 1.0 - float(params['i_trailing_stop_threshold']) / 100.0
relation_error = (stop_ratio - high_ratio * trail_factor).abs().dropna()
if not relation_error.empty and relation_error.max() > 1e-6:
    raise SystemExit(f"Trailing ratio relation mismatch: max error={relation_error.max():.9f}")

hits = df.loc[stop_ratio >= 1.0, ['time', 'close', 'trail_stop_price_ratio', 'trail_high_price_ratio']]
print(f"✅ Trailing diagnostics present; {len(hits)} Pine close-stop hit bar(s).")
if not hits.empty:
    print(hits.to_string(index=False))
PYEOF

# Run score parity check.
"$PYTHON" "$REPO/tools/check_mlp_parity.py" \
  --data "$DATA" \
  --weights "$WEIGHTS" \
  --params "$PARAMS"

# Compare the strategy-trades export when present.
if [ -n "$TV_TRADES" ]; then
  "$PYTHON" "$REPO/tools/compare_tv_trades.py" \
    --strategy-file strategy_mlp_scores.py \
    --tv-trades "$TV_TRADES" \
    --data "$DATA" \
    --params "$PARAMS" \
    --timeframe 8H \
    --exit-detail
fi
