//! # Budget Enforcement Example
//!
//! Demonstrates cost control with per-role budget limits and automatic
//! fallback.
//!
//! ## What This Example Shows
//! - Setting monthly and weekly budget limits
//! - Tracking spending against budgets
//! - Three-tier enforcement (normal, near-threshold, exceeded)
//! - Automatic fallback to cheaper providers
//! - Alert thresholds for proactive management
//!
//! ## Run
//! ```bash
//! cargo run --example 02-budget-enforcement -p vapora-llm-router
//! ```

fn main() {
    println!("=== Budget Enforcement Example ===\n");

    // Step 1: Define budget limits for roles
    #[derive(Debug, Clone)]
    struct RoleBudget {
        role: String,
        monthly_limit_cents: u32,
        weekly_limit_cents: u32,
        fallback_provider: String,
    }

    let budgets = vec![
        RoleBudget {
            role: "architect".to_string(),
            monthly_limit_cents: 50000, // $500/month
            weekly_limit_cents: 12500,  // $125/week
            fallback_provider: "gpt-4".to_string(),
        },
        RoleBudget {
            role: "developer".to_string(),
            monthly_limit_cents: 30000, // $300/month
            weekly_limit_cents: 7500,   // $75/week
            fallback_provider: "ollama".to_string(),
        },
    ];

    println!("Budget Configuration:\n");
    for budget in &budgets {
        println!(
            "  {}: ${:.2}/month, ${:.2}/week",
            budget.role,
            budget.monthly_limit_cents as f64 / 100.0,
            budget.weekly_limit_cents as f64 / 100.0
        );
        println!("    Fallback: {}\n", budget.fallback_provider);
    }

    // Step 2: Simulate spending for a developer
    println!("=== Spending Simulation (Developer Role) ===\n");

    let mut monthly_spent_cents = 0;
    let mut transactions = vec![];

    // Simulate task executions with costs
    let task_costs = vec![
        ("analyze_code", 2000, "Claude (Opus)"),
        ("write_docs", 1500, "Claude (Sonnet)"),
        ("run_tests", 500, "Ollama (local)"),
        ("refactor_module", 3000, "Claude (Opus)"),
        ("code_review", 1800, "Claude"),
        ("implement_feature", 4500, "Claude (Opus)"),
        ("fix_bug", 1200, "Claude (Sonnet)"),
    ];

    println!("Task Executions:");
    for (task, cost, provider) in &task_costs {
        monthly_spent_cents += cost;
        transactions.push((task, cost, provider));

        let percentage_used = (monthly_spent_cents as f64 / 30000.0) * 100.0;
        println!(
            "  {} ({}): ${:.2} → Running total: ${:.2} ({:.0}%)",
            task,
            provider,
            *cost as f64 / 100.0,
            monthly_spent_cents as f64 / 100.0,
            percentage_used
        );

        // Determine status
        if percentage_used >= 100.0 {
            println!("    ⚠️  BUDGET EXCEEDED - Switching to fallback provider!");
        } else if percentage_used >= 80.0 {
            println!(
                "    ⚠️  NEAR THRESHOLD ({:.0}%) - Alert triggered",
                percentage_used
            );
        } else if percentage_used >= 50.0 {
            println!("    ℹ️  Halfway through budget ({:.0}%)", percentage_used);
        }
        println!();
    }

    // Step 3: Demonstrate budget enforcement
    println!("=== Budget Status ===");
    let monthly_limit = 30000;
    let percentage = (monthly_spent_cents as f64 / monthly_limit as f64) * 100.0;

    println!("Monthly budget: ${:.2}", monthly_limit as f64 / 100.0);
    println!("Amount spent: ${:.2}", monthly_spent_cents as f64 / 100.0);
    println!(
        "Amount remaining: ${:.2}",
        (monthly_limit - monthly_spent_cents) as f64 / 100.0
    );
    println!("Utilization: {:.1}%\n", percentage);

    // Step 4: Show enforcement levels
    println!("=== Three-Tier Enforcement ===");

    let tiers = vec![
        (0.0, 50.0, "Normal", "Use preferred provider"),
        (50.0, 80.0, "Caution", "Monitor spending closely"),
        (80.0, 100.0, "Near Threshold", "Use cheaper alternative"),
        (100.0, 150.0, "Exceeded", "Use fallback provider only"),
    ];

    for (min, max, tier, action) in tiers {
        let status = if percentage >= min && percentage < max {
            "← CURRENT"
        } else {
            ""
        };
        println!(
            "  {}%–{}%: {} → {}  {}",
            min as u32, max as u32, tier, action, status
        );
    }

    // Step 5: Recommendations
    println!("\n=== Budget Management Strategy ===");
    println!(
        "Current tier: {}",
        if percentage < 50.0 {
            "Normal"
        } else if percentage < 80.0 {
            "Caution"
        } else if percentage < 100.0 {
            "Near Threshold"
        } else {
            "Exceeded"
        }
    );

    if percentage < 80.0 {
        println!("✓ Safe to continue with current spending patterns");
    } else {
        println!("⚠️  Recommendations:");
        println!("  1. Use cheaper models for routine tasks");
        println!("  2. Use Ollama (local) for testing/feedback");
        println!("  3. Batch similar tasks for efficiency");
        println!("  4. Consider increasing budget for next month");
    }
}
