#!/usr/bin/env herodo
// run_all_tests.rhai
// Runs all Nerdctl module tests

print("=== Running Nerdctl Module Tests ===");

// Custom assert function
fn assert_true(condition, message) {
    if !condition {
        print(`ASSERTION FAILED: ${message}`);
        throw message;
    }
}

// Helper function to check if nerdctl is available
fn is_nerdctl_available() {
    try {
        let result = run("which nerdctl");
        return result.success;
    } catch(e) {
        return false;
    }
}

// Helper function to clean up a container if it exists
fn cleanup_container(container_name) {
    try {
        run(`nerdctl stop ${container_name}`);
        run(`nerdctl rm ${container_name}`);
    } catch(e) {
        // Ignore errors during cleanup
    }
}

// Run each test directly
let passed = 0;
let failed = 0;
let skipped = 0;
let total = 0;

// Check if nerdctl is available
let nerdctl_available = is_nerdctl_available();
if !nerdctl_available {
    print("nerdctl is not available. Skipping all Nerdctl tests.");
    skipped = 3; // Skip all three tests
    total = 3;
} else {
    // Test 1: Container Operations
    print("\n--- Running Container Operations Tests ---");
    try {
        // Define test container name
        let container_name = "rhai_test_container";
        
        // Clean up any existing test container
        cleanup_container(container_name);
        
        // Create a new Container
        let container = nerdctl_container_new(container_name);
        
        // Set container image
        container.with_image("alpine:latest");
        
        // Set detach mode
        container.with_detach(true);
        
        // Run the container
        let run_result = container.run();
        assert_true(run_result.success, "Container run should succeed");
        
        // Execute a command in the container
        let exec_result = container.exec("echo 'Hello from container'");
        assert_true(exec_result.success, "Container exec should succeed");
        
        // Clean up
        container.stop();
        container.remove();
        
        print("--- Container Operations Tests completed successfully ---");
        passed += 1;
    } catch(err) {
        print(`!!! Error in Container Operations Tests: ${err}`);
        failed += 1;
        
        // Clean up in case of error
        cleanup_container("rhai_test_container");
    }
    total += 1;
    
    // Test 2: Image Operations
    print("\n--- Running Image Operations Tests ---");
    try {
        // Create a temporary directory for testing
        let test_dir = "rhai_test_nerdctl";
        mkdir(test_dir);
        
        // Pull a small image for testing
        let pull_result = nerdctl_image_pull("alpine:latest");
        assert_true(pull_result.success, "Image pull should succeed");
        
        // List images
        let images_result = nerdctl_images();
        assert_true(images_result.success, "Image listing should succeed");
        
        // Clean up
        delete(test_dir);
        
        print("--- Image Operations Tests completed successfully ---");
        passed += 1;
    } catch(err) {
        print(`!!! Error in Image Operations Tests: ${err}`);
        failed += 1;
        
        // Clean up in case of error
        try {
            delete("rhai_test_nerdctl");
        } catch(e) {
            // Ignore errors during cleanup
        }
    }
    total += 1;
    
    // Test 3: Container Builder Pattern
    print("\n--- Running Container Builder Pattern Tests ---");
    try {
        // Define test container name
        let container_name = "rhai_test_builder";
        
        // Clean up any existing test container
        cleanup_container(container_name);
        
        // Create test directory
        let work_dir = "rhai_test_nerdctl_work";
        mkdir(work_dir);
        
        // Create a container with builder pattern
        let container = nerdctl_container_from_image(container_name, "alpine:latest")
            .reset()
            .with_detach(true)
            .with_volumes([`${work_dir}:/data`]);
        
        // Run the container
        let run_result = container.run();
        assert_true(run_result.success, "Container run should succeed");
        
        // Clean up
        container.stop();
        container.remove();
        delete(work_dir);
        
        print("--- Container Builder Pattern Tests completed successfully ---");
        passed += 1;
    } catch(err) {
        print(`!!! Error in Container Builder Pattern Tests: ${err}`);
        failed += 1;
        
        // Clean up in case of error
        cleanup_container("rhai_test_builder");
        try {
            delete("rhai_test_nerdctl_work");
        } catch(e) {
            // Ignore errors during cleanup
        }
    }
    total += 1;
}

print("\n=== Test Summary ===");
print(`Passed: ${passed}`);
print(`Failed: ${failed}`);
print(`Skipped: ${skipped}`);
print(`Total: ${total}`);

if failed == 0 {
    if skipped > 0 {
        print("\n⚠️ All tests skipped or passed!");
    } else {
        print("\n✅ All tests passed!");
    }
} else {
    print("\n❌ Some tests failed!");
}

// Return the number of failed tests (0 means success)
failed;
