"""Two Monte Carlo checks, 5,000 paths a run, in sequence.

  a. prime.day_split_mc scores the target, the floor and the daily rule once a day, after all k
     trades. An equity floor and a target are crossed on a trade, not at the day's end. A copy
     with the barriers checked after every trade, against the module, k = 2 and 3, both rules.
  b. the remedy for the strict daily reading: assessment risk 2.75% (q_l 0.29% at 00:00 UTC,
     s06) against 3% (1.15%), the wallet gate at the deployed cost.
"""
import numpy as np

from common import PA, G_COIN, G_SPREAD

g26 = PA.cost_share(34.791728647093755)


def day_split_per_trade(k, risk, cost, rule="loss", n=5000, seed=1, max_days=4000, target=PA.TARGET, dd=PA.MAXDD, daily=PA.DAILY):
    rng = np.random.default_rng(seed)
    eq = np.zeros(n); live = np.ones(n, bool); passed = np.zeros(n, bool); days = np.zeros(n)
    for _ in range(max_days):
        a = live & ~passed
        if not a.any():
            break
        prev = eq.copy()
        on = a.copy()
        for _ in range(k):
            win = rng.random(n) < 0.5
            eq = np.where(on, eq + np.where(win, risk, -risk) - cost, eq)
            dead = on & ((eq <= -dd + 1e-12) | ((prev - eq) > daily * (1.0 + prev) + 1e-12))
            live &= ~dead
            done = on & live & (eq >= target - 1e-12)
            passed |= done
            on &= live & ~done
            on &= win if rule == "loss" else ~win
        days += a
    ok = passed & live
    return float(ok.mean()), float(days[ok].mean())


print("k rule  risk    module(5000)   per-trade barriers(5000)")
for k, rule, r in ((1, "loss", 0.03), (2, "loss", 0.01575), (2, "win", 0.022113), (3, "win", 0.014742)):
    for seed in (1, 2):
        m = PA.day_split_mc(k, r, g26 * r, rule, n=5000, seed=seed)
        p, dpass = day_split_per_trade(k, r, g26 * r, rule, seed=seed)
        print(f"{k} {rule:4} {r:.3%}  {m['p_pass']:.2%} {m['days_pass']:5.1f}d   {p:.2%} {dpass:5.1f}d   (seed {seed})")
