"""Regression coverage for image-only user content across native compaction."""

from agent.codex_responses_adapter import _chat_messages_to_responses_input
from agent.native_compaction import prune_pre_checkpoint_items


_IMAGE_URL = "data:image/png;base64,AAAA"
_CHAT_IMAGE_PART = {"type": "image_url", "image_url": {"url": _IMAGE_URL}}
_RESPONSES_IMAGE_PART = {"type": "input_image", "image_url": _IMAGE_URL}
_CHECKPOINT = {"type": "compaction", "encrypted_content": "blob_cp"}




def test_image_only_user_message_survives_pre_checkpoint_pruning_verbatim():
    image_only = {"role": "user", "content": [_RESPONSES_IMAGE_PART]}
    items = [
        image_only,
        _CHECKPOINT,
        {"role": "user", "content": "after checkpoint"},
    ]

    pruned = prune_pre_checkpoint_items(items, retained_user_token_budget=1)

    assert pruned == [
        _CHECKPOINT,
        image_only,
        {"role": "user", "content": "after checkpoint"},
    ]
    assert pruned[1] is image_only


def test_image_only_user_message_still_obeys_retention_budget():
    image_only = {"role": "user", "content": [_RESPONSES_IMAGE_PART]}

    assert prune_pre_checkpoint_items(
        [image_only, _CHECKPOINT],
        retained_user_token_budget=0,
    ) == [_CHECKPOINT]


def test_malformed_or_unknown_multipart_is_not_retained():
    invalid_contents = [
        [{}],
        [{"type": "input_image", "image_url": ""}],
        [{"type": "unknown", "value": "not an attachment"}],
    ]

    for content in invalid_contents:
        malformed = {"role": "user", "content": content}
        assert prune_pre_checkpoint_items(
            [malformed, _CHECKPOINT],
            retained_user_token_budget=1,
        ) == [_CHECKPOINT]


def test_adapter_preserves_image_only_user_message_across_checkpoint():
    messages = [
        {"role": "user", "content": [_CHAT_IMAGE_PART]},
        {
            "role": "assistant",
            "content": "checkpoint turn",
            "codex_reasoning_items": [_CHECKPOINT],
        },
        {"role": "user", "content": "after checkpoint"},
    ]

    converted = _chat_messages_to_responses_input(
        messages,
        native_compaction_eligible=True,
    )

    assert converted == [
        _CHECKPOINT,
        {"type": "message", "role": "user", "content": [_RESPONSES_IMAGE_PART]},
        {"type": "message", "role": "assistant", "content": "checkpoint turn"},
        {"type": "message", "role": "user", "content": "after checkpoint"},
    ]


def test_image_only_user_message_is_retained_with_interleaved_assistant():
    image_user = {
        "role": "user",
        "content": [_RESPONSES_IMAGE_PART],
    }
    items = [
        image_user,
        {"role": "assistant", "content": "I see the screenshot."},
        _CHECKPOINT,
        {"role": "user", "content": "what was in that screenshot?"},
    ]
    out = prune_pre_checkpoint_items(items)
    assert out[0] == _CHECKPOINT
    assert out[1] == image_user
    assert out[2] == {"role": "user", "content": "what was in that screenshot?"}
