import pytest
import subprocess
import time

# Configuration (adjust these as needed)
RWL_SYSTEM_COMMAND = "rwl"  # Assuming you have a command-line interface
API_URL = "http://localhost:8000/api" # Adjust if your API runs elsewhere

def test_create_user_e2e():
    try:
        result = subprocess.run([RWL_SYSTEM_COMMAND, "create_user", "e2e_user"], capture_output=True, text=True, check=True)
        assert "User created" in result.stdout
    except subprocess.CalledProcessError as e:
        pytest.fail(f"Command failed: {e.stderr}")

def test_create_resource_e2e():
    try:
        result = subprocess.run([RWL_SYSTEM_COMMAND, "create_resource", "e2e_resource"], capture_output=True, text=True, check=True)
        assert "Resource created" in result.stdout
    except subprocess.CalledProcessError as e:
        pytest.fail(f"Command failed: {e.stderr}")

def test_acquire_and_release_read_lock_e2e():
    # Create user and resource (simplified, assuming IDs are sequential or retrievable)
    try:
        subprocess.run([RWL_SYSTEM_COMMAND, "create_user", "reader_user"], capture_output=True, text=True, check=True)
        subprocess.run([RWL_SYSTEM_COMMAND, "create_resource", "read_resource"], capture_output=True, text=True, check=True)

        # Acquire read lock (assuming user_id=1 and resource_id=1 after creation)
        result = subprocess.run([RWL_SYSTEM_COMMAND, "acquire_read_lock", "1", "1"], capture_output=True, text=True, check=True)
        assert "Read lock acquired" in result.stdout

        #Get lock ID (assuming it's returned by the command):
        lock_id = result.stdout.split(":")[1].strip()

        # Release read lock
        result = subprocess.run([RWL_SYSTEM_COMMAND, "release_lock", lock_id], capture_output=True, text=True, check=True)

        assert "Lock released" in result.stdout

    except subprocess.CalledProcessError as e:
        pytest.fail(f"Command failed: {e.stderr}")

def test_acquire_and_release_write_lock_e2e():
    # Create user and resource (simplified, assuming IDs are sequential or retrievable)
    try:
        subprocess.run([RWL_SYSTEM_COMMAND, "create_user", "writer_user"], capture_output=True, text=True, check=True)
        subprocess.run([RWL_SYSTEM_COMMAND, "create_resource", "write_resource"], capture_output=True, text=True, check=True)

        # Acquire write lock (assuming user_id=2 and resource_id=2 after creation)
        result = subprocess.run([RWL_SYSTEM_COMMAND, "acquire_write_lock", "2", "2"], capture_output=True, text=True, check=True)
        assert "Write lock acquired" in result.stdout

        #Get lock ID (assuming it's returned by the command):
        lock_id = result.stdout.split(":")[1].strip()

        # Release write lock
        result = subprocess.run([RWL_SYSTEM_COMMAND, "release_lock", lock_id], capture_output=True, text=True, check=True)
        assert "Lock released" in result.stdout

    except subprocess.CalledProcessError as e:
        pytest.fail(f"Command failed: {e.stderr}")

# Add more comprehensive e2e tests here, considering different scenarios, error handling, etc.