use markbase::raid::{RaidController, RaidLevel, RaidExporter};
use std::path::PathBuf;
use std::fs;

fn main() {
    println!("=== RAID 5 真實測試 ===");
    println!("");
    
    let disk_paths = vec![
        PathBuf::from("data/raid5_test_disks/disk1.sparseimage"),
        PathBuf::from("data/raid5_test_disks/disk2.sparseimage"),
        PathBuf::from("data/raid5_test_disks/disk3.sparseimage"),
    ];
    
    println!("測試配置：");
    println!("  3個虛擬磁盤（每個100MB）");
    println!("  RAID 5 阵列（實際容量200MB）");
    println!("  Parity盘：1個");
    println!("  容錯能力：可容忍1個磁盤故障");
    println!("");
    
    let controller = RaidController::new();
    
    println!("Step 1: 创建 RAID 5 阵列...");
    let array_id = controller.create_array(
        RaidLevel::RAID5,
        disk_paths.clone(),
        64 * 1024, // 64KB stripe size
    );
    
    match array_id {
        Ok(id) => {
            println!("✅ RAID 5 阵列创建成功: {}", id);
            println!("");
            
            println!("Step 2: 寫入測試數據...");
            let test_data = b"RAID 5 Test Data: Hello from 3-disk parity array!";
            
            match controller.write(&id, 0, test_data) {
                Ok(_) => println!("✅ 寫入成功（{} bytes）", test_data.len()),
                Err(e) => {
                    println!("⚠️ 寫入失敗: {}", e);
                    println!("原因：虛擬磁盤為空，無法直接寫入");
                    println!("");
                    println!("解決方案：先掛載虛擬磁盤並初始化");
                    return;
                },
            }
            println!("");
            
            println!("Step 3: 讀取測試數據...");
            match controller.read(&id, 0, test_data.len() as u64) {
                Ok(data) => {
                    println!("✅ 讀取成功");
                    println!("數據: {:?}", String::from_utf8_lossy(&data));
                },
                Err(e) => println!("❌ 讀取失敗: {}", e),
            }
            println!("");
            
            println!("Step 4: 導出 RAID 5 到虛擬磁盤...");
            let exporter = RaidExporter::new(controller);
            let vdisk_path = PathBuf::from("data/raid5_exported.vdisk");
            
            match exporter.export_to_vdisk(&id, &vdisk_path, 1024 * 1024) {
                Ok(bytes) => println!("✅ 導出成功（{} bytes）", bytes),
                Err(e) => println!("❌ 導出失敗: {}", e),
            }
        },
        Err(e) => {
            println!("❌ RAID 5 阵列创建失敗: {}", e);
            println!("");
            println!("可能原因：");
            println!("  1. 虛擬磁盤文件不存在");
            println!("  2. 虛擬磁盤為空（無法作為RAID成員）");
            println!("  3. 需要先掛載並初始化虛擬磁盤");
        },
    }
    
    println!("");
    println!("=== RAID 5 架构說明 ===");
    println!("");
    println!("RAID 5 工作原理：");
    println!("  磁盤0: [Stripe0, Stripe2, P1]");
    println!("  磁盤1: [Stripe1, P0, Stripe3]");
    println!("  磁盤2: [P2, Stripe0, Stripe1]");
    println!("  （P = Parity, 旋轉位置）");
    println!("");
    println!("故障恢復示例：");
    println!("  磁盤1故障 → 從磁盤0 + 磁盤2 + Parity重建");
    println!("  P0 = Stripe0 XOR Stripe1 XOR Stripe2");
    println!("  Stripe1 = P0 XOR Stripe0 XOR Stripe2");
    println!("");
    println!("容量計算：");
    println!("  3磁盤 × 100MB = 300MB總容量");
    println!("  RAID 5容量 = (3-1) × 100MB = 200MB");
    println!("  Parity占用 = 100MB（1個磁盤）");
}