import numpy as np
import pandas as pd

def run_enhanced_genesis_poisoning(
    poison_sessions=20,
    post_sessions=80,
    poison_strategy="struggling_high_potential"  # or "mediocre_anchor"
):
    """
    Enhanced Genesis Poisoning following the detailed protocol:
    - Baseline generation (sessions 1-20) with controlled injection.
    - Lock the absolute_historical_floor at session 21.
    - Then run high-performance sessions and measure impact.
    """
    np.random.seed(42)
    
    results = []
    observed_accuracies = []
    absolute_floor = None
    rolling = 0.85
    
    total_sessions = poison_sessions + post_sessions
    
    for s in range(total_sessions):
        session_num = s + 1
        
        if s < poison_sessions:
            # Poison phase - controlled injection
            if poison_strategy == "struggling_high_potential":
                # Mimic a student who struggles but has "high potential"
                observed = 0.58 + np.random.normal(0, 0.06)
            else:
                # Mediocre anchor
                observed = 0.68 + np.random.normal(0, 0.05)
            observed = max(0.45, min(0.78, observed))
        else:
            # Post-poison: high performance (real student)
            observed = 0.87 + np.random.normal(0, 0.04)
            observed = max(0.70, min(0.97, observed))
        
        observed_accuracies.append(observed)
        
        # Update rolling baseline
        recent = observed_accuracies[-10:] if len(observed_accuracies) >= 10 else observed_accuracies
        rolling = np.mean(recent)
        
        # Lock the Absolute Floor after poison phase
        if s == poison_sessions - 1 and absolute_floor is None:
            absolute_floor = max(observed_accuracies[:poison_sessions])
        
        # Effective baseline (with mitigation)
        if absolute_floor is not None:
            effective = max(rolling, absolute_floor * 0.92)
        else:
            effective = rolling
        
        results.append({
            'session': session_num,
            'phase': 'Poison' if s < poison_sessions else 'Post-Poison',
            'observed_accuracy': round(observed, 3),
            'rolling_baseline': round(rolling, 3),
            'absolute_floor': round(absolute_floor, 3) if absolute_floor else None,
            'effective_baseline': round(effective, 3)
        })
    
    df = pd.DataFrame(results)
    
    # Analysis
    poison_floor = df[df['phase'] == 'Poison']['absolute_floor'].iloc[-1]
    final_observed = df[df['phase'] == 'Post-Poison']['observed_accuracy'].iloc[-1]
    final_effective = df[df['phase'] == 'Post-Poison']['effective_baseline'].iloc[-1]
    
    print("=== Enhanced Genesis Poisoning Simulation ===")
    print(f"Poison strategy: {poison_strategy}")
    print(f"Poisoned sessions: {poison_sessions}")
    print(f"Locked Absolute Floor value: {poison_floor}")
    print(f"Final observed accuracy (high performance): {final_observed}")
    print(f"Final effective baseline: {final_effective}")
    
    delta = 0.85 - poison_floor
    print(f"\nDelta from healthy baseline (0.85): {delta:.3f} ({delta*100:.1f}%)")
    
    if delta > 0.15:
        print("CRITICAL: Poisoned floor creates >15% structural hazard.")
    else:
        print("Moderate impact — mitigation partially contains damage.")
    
    return df

if __name__ == "__main__":
    df1 = run_enhanced_genesis_poisoning(poison_strategy="struggling_high_potential")
    df1.to_csv('/home/workdir/artifacts/genesis_poisoning_struggling.csv', index=False)
    
    print("\n--- Second run with mediocre anchor strategy ---")
    df2 = run_enhanced_genesis_poisoning(poison_strategy="mediocre_anchor")
    df2.to_csv('/home/workdir/artifacts/genesis_poisoning_mediocre.csv', index=False)