import pandas as pd
from pathlib import Path
import sys

BASE_PATH = Path(__file__).resolve().parents[2]
SRC_PATH = BASE_PATH / "src"

if str(SRC_PATH) not in sys.path:
    sys.path.append(str(SRC_PATH))

from research.combined_candidate_matrix_v1 import run_combo


def simulate_account(
    trades: int,
    win_rate: float,
    avg_return: float,
    starting_balance: float = 100_000.0,
    risk_fraction: float = 0.005,
):
    """
    Simple account-level simulation proxy.

    We use the model's per-trade avg_return as the raw edge and scale by
    chosen account risk fraction to estimate balance path.

    This is still a simplification, but it gives a practical FTMO-style view.
    """
    # Approximate per-trade account return
    scaled_trade_return = avg_return / 0.0025 * risk_fraction

    equity = [starting_balance]
    balance = starting_balance

    for _ in range(trades):
        balance *= (1 + scaled_trade_return)
        equity.append(balance)

    equity = pd.Series(equity)
    peak = equity.cummax()
    dd = equity / peak - 1

    return {
        "ending_balance": equity.iloc[-1],
        "max_drawdown_pct": dd.min(),
    }


def run_test():
    candidates = [
        {"name": "growth_52h", "threshold": 2.75, "fib": 0.786, "hold_hours": 52},
        {"name": "smoother_25h", "threshold": 2.75, "fib": 0.786, "hold_hours": 25},
    ]

    risks = [0.0025, 0.0050, 0.0075]  # 0.25%, 0.5%, 0.75%

    rows = []

    for c in candidates:
        res = run_combo(
            threshold=c["threshold"],
            fib=c["fib"],
            hold_hours=c["hold_hours"],
        )

        for r in risks:
            sim = simulate_account(
                trades=res["trades"],
                win_rate=res["win_rate"],
                avg_return=res["avg_return"],
                starting_balance=100_000.0,
                risk_fraction=r,
            )

            rows.append({
                "candidate": c["name"],
                "threshold": c["threshold"],
                "fib": c["fib"],
                "hold_hours": c["hold_hours"],
                "risk_per_trade": r,
                "trades": res["trades"],
                "win_rate": res["win_rate"],
                "avg_return": res["avg_return"],
                "model_final_equity": res["final_equity"],
                "model_max_dd": res["max_drawdown"],
                "ending_balance_100k": sim["ending_balance"],
                "sim_max_dd": sim["max_drawdown_pct"],
            })

    df = pd.DataFrame(rows)

    print("\n=== FTMO 100K SIMULATION V1 ===\n")
    print(df.to_string(index=False))

    print("\nBest by ending balance:")
    print(df.sort_values("ending_balance_100k", ascending=False).head(6).to_string(index=False))

    print("\nBest by lowest simulated drawdown:")
    print(df.sort_values("sim_max_dd", ascending=False).head(6).to_string(index=False))


if __name__ == "__main__":
    run_test()