import pytest
from e2b import Sandbox


@pytest.mark.skip_debug()
def test_create_snapshot(sandbox: Sandbox):
    snapshot = sandbox.create_snapshot()

    assert snapshot.snapshot_id
    assert len(snapshot.snapshot_id) > 0

    Sandbox.delete_snapshot(snapshot.snapshot_id)


@pytest.mark.skip_debug()
def test_create_sandbox_from_snapshot(sandbox: Sandbox):
    test_content = "content from original sandbox"
    sandbox.files.write("/home/user/test.txt", test_content)

    snapshot = sandbox.create_snapshot()

    try:
        new_sandbox = Sandbox.create(snapshot.snapshot_id)

        try:
            content = new_sandbox.files.read("/home/user/test.txt")
            assert content == test_content
        finally:
            new_sandbox.kill()
    finally:
        Sandbox.delete_snapshot(snapshot.snapshot_id)


@pytest.mark.skip_debug()
def test_create_multiple_sandboxes_from_snapshot(sandbox: Sandbox):
    test_content = "shared snapshot content"
    sandbox.files.write("/home/user/shared.txt", test_content)

    snapshot = sandbox.create_snapshot()

    try:
        sandbox1 = Sandbox.create(snapshot.snapshot_id)
        sandbox2 = Sandbox.create(snapshot.snapshot_id)

        try:
            content1 = sandbox1.files.read("/home/user/shared.txt")
            content2 = sandbox2.files.read("/home/user/shared.txt")

            assert content1 == test_content
            assert content2 == test_content

            sandbox1.files.write("/home/user/shared.txt", "modified in sandbox1")

            modified_content = sandbox1.files.read("/home/user/shared.txt")
            unchanged_content = sandbox2.files.read("/home/user/shared.txt")

            assert modified_content == "modified in sandbox1"
            assert unchanged_content == test_content
        finally:
            sandbox1.kill()
            sandbox2.kill()
    finally:
        Sandbox.delete_snapshot(snapshot.snapshot_id)


@pytest.mark.skip_debug()
def test_list_snapshots(sandbox: Sandbox):
    snapshot = sandbox.create_snapshot()

    try:
        paginator = Sandbox.list_snapshots()
        assert paginator.has_next

        snapshots = paginator.next_items()
        assert isinstance(snapshots, list)

        found = any(s.snapshot_id == snapshot.snapshot_id for s in snapshots)
        assert found
    finally:
        Sandbox.delete_snapshot(snapshot.snapshot_id)


@pytest.mark.skip_debug()
def test_list_snapshots_for_sandbox(sandbox: Sandbox):
    snapshot = sandbox.create_snapshot()

    try:
        paginator = Sandbox.list_snapshots(sandbox_id=sandbox.sandbox_id)
        snapshots = paginator.next_items()

        found = any(s.snapshot_id == snapshot.snapshot_id for s in snapshots)
        assert found
    finally:
        Sandbox.delete_snapshot(snapshot.snapshot_id)


@pytest.mark.skip_debug()
def test_create_named_snapshot(sandbox: Sandbox, sandbox_test_id: str):
    snapshot_name = f"snap-{sandbox_test_id}"

    snapshot = sandbox.create_snapshot(name=snapshot_name)

    try:
        assert snapshot.snapshot_id
        assert isinstance(snapshot.names, list)
        assert len(snapshot.names) > 0
        assert any(snapshot_name in n for n in snapshot.names)
    finally:
        Sandbox.delete_snapshot(snapshot.snapshot_id)


@pytest.mark.skip_debug()
def test_delete_snapshot(sandbox: Sandbox):
    snapshot = sandbox.create_snapshot()

    deleted = Sandbox.delete_snapshot(snapshot.snapshot_id)
    assert deleted is True

    deleted_again = Sandbox.delete_snapshot(snapshot.snapshot_id)
    assert deleted_again is False


@pytest.mark.skip_debug()
def test_snapshot_preserves_filesystem(sandbox: Sandbox):
    app_dir = "/home/user/app"
    config_path = f"{app_dir}/config.json"
    config_content = '{"env": "test"}'
    data_path = f"{app_dir}/data.txt"
    data_content = "important data"

    sandbox.files.make_dir(app_dir)
    sandbox.files.write(config_path, config_content)
    sandbox.files.write(data_path, data_content)

    snapshot = sandbox.create_snapshot()

    try:
        new_sandbox = Sandbox.create(snapshot.snapshot_id)

        try:
            dir_exists = new_sandbox.files.exists(app_dir)
            assert dir_exists

            config = new_sandbox.files.read(config_path)
            data = new_sandbox.files.read(data_path)

            assert config == config_content
            assert data == data_content
        finally:
            new_sandbox.kill()
    finally:
        Sandbox.delete_snapshot(snapshot.snapshot_id)


@pytest.mark.skip_debug()
def test_create_snapshot_class_method(sandbox: Sandbox):
    snapshot = Sandbox.create_snapshot(sandbox.sandbox_id)

    assert snapshot.snapshot_id
    assert len(snapshot.snapshot_id) > 0

    Sandbox.delete_snapshot(snapshot.snapshot_id)
