#!/bin/bash
# Cross-platform CLI test suite for ProofMode
# Tests Rust, Python, and Ruby CLIs for feature parity

set -e

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Test results
PASSED=0
FAILED=0

# Test data
TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$TEST_DIR")"
TEST_IMAGE="$TEST_DIR/test_image.jpg"
TEST_VIDEO="$TEST_DIR/test_video.mp4"
TEST_METADATA='{"description":"Test media","location":"Test Lab"}'

# Create test media files
setup_test_files() {
    echo "Setting up test files..."
    
    # Create a simple test image (1x1 pixel JPEG)
    printf "\xFF\xD8\xFF\xE0\x00\x10\x4A\x46\x49\x46\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00" > "$TEST_IMAGE"
    printf "\xFF\xDB\x00\x43\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\x09\x09\x08\x0A\x0C" >> "$TEST_IMAGE"
    printf "\x14\x0D\x0C\x0B\x0B\x0C\x19\x12\x13\x0F\x14\x1D\x1A\x1F\x1E\x1D\x1A\x1C\x1C" >> "$TEST_IMAGE"
    printf "\xFF\xC0\x00\x0B\x08\x00\x01\x00\x01\x01\x01\x11\x00\xFF\xC4\x00\x1F\x00\x00\x01" >> "$TEST_IMAGE"
    printf "\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05" >> "$TEST_IMAGE"
    printf "\x06\x07\x08\x09\x0A\x0B\xFF\xDA\x00\x08\x01\x01\x00\x00\x3F\x00\xFD\xFC\xA0\xFF\xD9" >> "$TEST_IMAGE"
    
    # Create a simple test text file as video placeholder
    echo "Test video content" > "$TEST_VIDEO"
}

# Cleanup test files
cleanup_test_files() {
    rm -f "$TEST_IMAGE" "$TEST_VIDEO"
    rm -rf "$PROJECT_ROOT/proofmode"
    rm -rf "$PROJECT_ROOT/python-uniffi/proofmode"
    rm -rf "$PROJECT_ROOT/ruby-uniffi/proofmode"
}

# Run a test and check result
run_test() {
    local test_name="$1"
    local command="$2"
    local expected_pattern="$3"
    
    echo -n "Testing $test_name... "
    
    if output=$($command 2>&1); then
        if [[ -z "$expected_pattern" ]] || echo "$output" | grep -q "$expected_pattern"; then
            echo -e "${GREEN}PASSED${NC}"
            ((PASSED++))
        else
            echo -e "${RED}FAILED${NC}"
            echo "  Expected pattern: $expected_pattern"
            echo "  Output: $output"
            ((FAILED++))
        fi
    else
        echo -e "${RED}FAILED${NC}"
        echo "  Command failed with exit code: $?"
        echo "  Output: $output"
        ((FAILED++))
    fi
}

# Test version command
test_version() {
    local cli="$1"
    local cmd="$2"
    
    echo -e "\n${YELLOW}Testing $cli version command...${NC}"
    run_test "$cli version" "$cmd --version" "0.4.0"
}

# Test help command
test_help() {
    local cli="$1"
    local cmd="$2"
    
    echo -e "\n${YELLOW}Testing $cli help command...${NC}"
    run_test "$cli help" "$cmd --help" "ProofMode"
}

# Test generate command
test_generate() {
    local cli="$1"
    local cmd="$2"
    local file_flag="$3"
    
    echo -e "\n${YELLOW}Testing $cli generate command...${NC}"
    
    # Test with image
    if [[ "$cli" == "Python" ]]; then
        run_test "$cli generate image" "$cmd generate $file_flag $TEST_IMAGE" "Proof generated successfully"
    else
        run_test "$cli generate image" "$cmd generate $TEST_IMAGE" "generated"
    fi
}

# Test check command
test_check() {
    local cli="$1"
    local cmd="$2"
    
    echo -e "\n${YELLOW}Testing $cli check command...${NC}"
    run_test "$cli check" "$cmd check $TEST_IMAGE" "check"
}

# Main test execution
main() {
    echo "==================================="
    echo "ProofMode Cross-Platform CLI Tests"
    echo "==================================="
    
    setup_test_files
    
    # Test Rust CLI
    if command -v proofmode &> /dev/null; then
        test_version "Rust" "proofmode"
        test_help "Rust" "proofmode"
        test_generate "Rust" "proofmode" ""
        test_check "Rust" "proofmode"
    else
        echo -e "${YELLOW}Rust CLI not found, building...${NC}"
        cd "$PROJECT_ROOT"
        cargo build --release
        export PATH="$PROJECT_ROOT/target/release:$PATH"
        test_version "Rust" "proofmode"
        test_help "Rust" "proofmode"
        test_generate "Rust" "proofmode" ""
        test_check "Rust" "proofmode"
    fi
    
    # Test Python CLI
    if command -v proofmode-uniffi &> /dev/null; then
        test_version "Python" "proofmode-uniffi"
        test_help "Python" "proofmode-uniffi"
        test_generate "Python" "proofmode-uniffi" "-f"
        test_check "Python" "proofmode-uniffi"
    else
        echo -e "${YELLOW}Python CLI not found in PATH${NC}"
        # Try with virtual environment
        if [ -f "$PROJECT_ROOT/python-uniffi/venv/bin/proofmode-uniffi" ]; then
            PYTHON_CMD="$PROJECT_ROOT/python-uniffi/venv/bin/proofmode-uniffi"
            test_version "Python" "$PYTHON_CMD"
            test_help "Python" "$PYTHON_CMD"
            test_generate "Python" "$PYTHON_CMD" "-f"
            test_check "Python" "$PYTHON_CMD"
        else
            echo -e "${RED}Python CLI not found${NC}"
        fi
    fi
    
    # Test Ruby CLI
    if command -v "$PROJECT_ROOT/ruby-uniffi/bin/proofmode" &> /dev/null; then
        RUBY_CMD="$PROJECT_ROOT/ruby-uniffi/bin/proofmode"
        # Ruby CLI requires FFI gem
        if ruby -e "require 'ffi'" 2>/dev/null; then
            test_version "Ruby" "$RUBY_CMD"
            test_help "Ruby" "$RUBY_CMD"
            test_generate "Ruby" "$RUBY_CMD" ""
            test_check "Ruby" "$RUBY_CMD"
        else
            echo -e "${YELLOW}Ruby FFI gem not installed, skipping Ruby tests${NC}"
        fi
    else
        echo -e "${RED}Ruby CLI not found${NC}"
    fi
    
    # Cleanup
    cleanup_test_files
    
    # Summary
    echo -e "\n==================================="
    echo "Test Summary"
    echo "==================================="
    echo -e "Passed: ${GREEN}$PASSED${NC}"
    echo -e "Failed: ${RED}$FAILED${NC}"
    
    if [ $FAILED -eq 0 ]; then
        echo -e "\n${GREEN}All tests passed!${NC}"
        exit 0
    else
        echo -e "\n${RED}Some tests failed!${NC}"
        exit 1
    fi
}

# Run the tests
main "$@"