import math

def simulate_m1_integrity():
    delta = {}
    for l in range(1, 21):
        delta[l] = int(500 * (l ** 2.3) + 100 * l)
    base_20 = delta[20]
    for l in range(21, 41):
        step = l - 20
        delta[l] = int(base_20 * ((1 + 0.085 * step) ** 2.4))
    base_40 = delta[40]
    for l in range(41, 61):
        step = l - 40
        delta[l] = int(base_40 * math.exp(0.092 * step))
    base_60 = delta[60]
    k_lin = int(base_60 * 0.12)
    for l in range(61, 81):
        step = l - 60
        delta[l] = int(base_60 + k_lin * step)
    base_80 = delta[80]
    for l in range(81, 91):
        step = l - 80
        delta[l] = int(base_80 * math.exp(0.145 * step))
    base_90 = delta[90]
    for l in range(91, 100):
        step = l - 90
        delta[l] = int(base_90 * math.exp(0.24 * step))
    sum_1_98 = sum(delta[l] for l in range(1, 99))
    delta[99] = int(0.33 * sum_1_98)

    # Progression benchmarks rows for levels 1 to 100
    rows = []
    running_cum = 0
    for l in range(1, 101):
        cum_exp = running_cum
        if l < 100:
            exp_next = delta[l]
            running_cum += delta[l]
            tgt_exp = running_cum  # cumulative threshold to reach l+1
        else:
            exp_next = 0  # cap at 100
            tgt_exp = running_cum + delta[99]  # strictly monotonic milestone threshold
            
        rows.append({
            'level': l,
            'target_exp': tgt_exp,
            'cumulative_exp': cum_exp,
            'exp_to_next_level': exp_next
        })

    # Run exact monotonicity check from game_design_matrix_service.py:241-248
    violations = []
    prev_xp = 0
    for r in rows:
        if r["target_exp"] <= prev_xp:
            violations.append(f"Progression Curve non-monotonic at level {r['level']}: XP {r['target_exp']} <= {prev_xp}.")
        prev_xp = r["target_exp"]

    print(f"Total rows: {len(rows)}")
    print(f"Violations count: {len(violations)}")
    if violations:
        print("Violations:", violations)
    else:
        print("SUCCESS: 100% STRICT MONOTONICITY ACROSS ALL 100 LEVELS!")
        print(f"L=1: target_exp={rows[0]['target_exp']}, cum={rows[0]['cumulative_exp']}, next={rows[0]['exp_to_next_level']}")
        print(f"L=2: target_exp={rows[1]['target_exp']}, cum={rows[1]['cumulative_exp']}, next={rows[1]['exp_to_next_level']}")
        print(f"L=99: target_exp={rows[98]['target_exp']}, cum={rows[98]['cumulative_exp']}, next={rows[98]['exp_to_next_level']}")
        print(f"L=100: target_exp={rows[99]['target_exp']}, cum={rows[99]['cumulative_exp']}, next={rows[99]['exp_to_next_level']}")

if __name__ == '__main__':
    simulate_m1_integrity()
