"""Additional tests for OutboxWorker edge cases."""

from __future__ import annotations

from types import SimpleNamespace
from unittest.mock import Mock

from core.models import OutboxEvent
from index.outbox_worker import OutboxWorker, WorkerResult


def test_build_request_context_from_user_uri():
    worker = OutboxWorker(vector_index=Mock(), embedder=Mock())
    event = OutboxEvent(
        event_id="evt-1",
        event_type="UPSERT_DIRECTORY",
        uri="ctx://acct-1/users/u1/memories/preferences/",
        payload={},
        status="PENDING",
    )

    ctx = worker._build_request_context(event)

    assert ctx is not None
    assert ctx.account_id == "acct-1"
    assert ctx.user_id == "u1"
    assert ctx.agent_id == "outbox-worker"


def test_run_once_passes_built_context_to_process_event(monkeypatch):
    worker = OutboxWorker(vector_index=Mock(), embedder=Mock())
    event = OutboxEvent(
        event_id="evt-2",
        event_type="UPSERT_DIRECTORY",
        uri="ctx://acct-1/users/u1/memories/preferences/",
        payload={},
        status="PENDING",
    )
    store = Mock()
    store.list_pending.return_value = [(event.uri, event)]
    store.try_acquire.return_value = True
    process_event = Mock(return_value=WorkerResult(event_id=event.event_id, success=True))
    monkeypatch.setattr(worker, "process_event", process_event)
    monkeypatch.setattr(worker, "_handle_processing_result", Mock())

    worker.run_once(store, ["acct-1"], worker_id="worker-1")

    passed_ctx = process_event.call_args.args[1]
    assert passed_ctx.account_id == "acct-1"
    assert passed_ctx.user_id == "u1"


def test_build_request_context_returns_none_for_invalid_uri():
    worker = OutboxWorker(vector_index=Mock(), embedder=Mock())
    event = OutboxEvent(
        event_id="evt-3",
        event_type="UPSERT_CONTEXT",
        uri="not-a-ctx-uri",
        payload={},
        status="PENDING",
    )

    assert worker._build_request_context(event) is None


def test_run_once_uses_batch_claim_when_supported(monkeypatch):
    worker = OutboxWorker(vector_index=Mock(), embedder=Mock())
    event = OutboxEvent(
        event_id="evt-4",
        event_type="UPSERT_CONTEXT",
        uri="ctx://acct-1/users/u1/memories/profile",
        payload={"records": []},
        status="PENDING",
    )
    store = Mock()
    store.supports_batch_claim = True
    store.claim_batch.return_value = [(event.uri, event)]
    process_event = Mock(
        return_value=WorkerResult(event_id=event.event_id, success=True)
    )
    monkeypatch.setattr(worker, "process_event", process_event)

    stats = worker.run_once(store, ["acct-1"], worker_id="worker-2")

    store.claim_batch.assert_called_once_with(worker_id="worker-2")
    process_event.assert_called_once()
    store.mark_done.assert_called_once_with(event, event.uri)
    assert stats["processed"] == 1
    assert stats["succeeded"] == 1