/// 演示如何使用 features 切换不同的 channel 实现
/// 
/// 运行方式:
/// 1. 使用默认的 std::sync::mpsc:
///    cargo run --example channel_features_demo
/// 
/// 2. 使用 crossbeam::channel:
///    cargo run --example channel_features_demo --features crossbeam_channel

use fast_able::fast_thread_pool::{channel_types, TaskExecutor, init};
use std::sync::Arc;
use crossbeam::atomic::AtomicCell;

fn main() {
    // 初始化日志
    env_logger::init();
    
    // 显示当前使用的 channel 实现
    #[cfg(feature = "crossbeam_channel")]
    println!("🚀 使用 crossbeam::channel 实现");
    
    #[cfg(not(feature = "crossbeam_channel"))]
    println!("🚀 使用 std::sync::mpsc 实现");
    
    // 测试基本的 channel 功能
    test_basic_channel();
    
    // 测试统一的任务执行器
    test_unified_executor();
}

fn test_basic_channel() {
    println!("\n📡 测试基本 channel 功能:");
    
    let (tx, rx) = channel_types::unbounded::<String>();
    
    // 发送一些消息
    let messages = vec!["Hello", "World", "from", "Rust"];
    for msg in &messages {
        tx.send(msg.to_string()).unwrap();
    }
    
    // 接收消息
    for expected in &messages {
        let received = rx.recv().unwrap();
        println!("  ✅ 发送: {}, 接收: {}", expected, received);
        assert_eq!(&received, expected);
    }
    
    println!("  🎉 基本 channel 测试通过!");
}

fn test_unified_executor() {
    println!("\n⚡ 测试统一任务执行器:");
    
    // 初始化线程池
    init(false);
    
    // 创建任务执行器
    let executor = TaskExecutor::new(
        core_affinity::CoreId { id: 0 }, 
        -1  // 不开启实时内核
    );
    
    let counter = Arc::new(AtomicCell::new(0_i32));
    let test_counter = counter.clone();
    
    // 提交多个任务
    let task_count = 20;
    for i in 0..task_count {
        let counter = counter.clone();
        executor.spawn(move |core_id| {
            counter.fetch_add(1);
            println!("  📋 任务 {} 在核心 {} 上执行", i, core_id);
            
            // 模拟一些工作
            std::thread::sleep(std::time::Duration::from_millis(10));
        });
    }
    
    // 等待所有任务完成
    println!("  ⏳ 等待任务完成...");
    std::thread::sleep(std::time::Duration::from_millis(500));
    
    let completed_tasks = test_counter.load();
    println!("  ✅ 完成任务数: {}/{}", completed_tasks, task_count);
    
    if completed_tasks == task_count {
        println!("  🎉 统一任务执行器测试通过!");
    } else {
        println!("  ❌ 任务执行不完整");
    }
    
    // 显示执行器状态
    println!("  📊 当前队列中任务数: {}", executor.count.load());
} 