from unittest.mock import AsyncMock, MagicMock, patch

import pytest

from scribe.mcp._context import _user_id_ctx


@pytest.fixture(autouse=True)
def _bind_user():
    token = _user_id_ctx.set(7)
    yield
    _user_id_ctx.reset(token)


def _fake_note(task_kind="work"):
    n = MagicMock()
    n.to_dict.return_value = {"id": 1, "title": "T", "task_kind": task_kind}
    return n


@pytest.mark.asyncio
async def test_create_task_passes_kind():
    # kind=plan is retired (plans are milestones); 'issue' exercises passthrough.
    mock = AsyncMock(return_value=_fake_note(task_kind="issue"))
    with patch("scribe.mcp.tools.tasks.notes_svc.create_note", mock):
        from scribe.mcp.tools.tasks import create_task
        await create_task(title="P", kind="issue")
    assert mock.call_args.kwargs["task_kind"] == "issue"


@pytest.mark.asyncio
async def test_list_tasks_passes_kind_filter():
    mock = AsyncMock(return_value=([], 0))
    with patch("scribe.mcp.tools.tasks.notes_svc.list_notes", mock):
        from scribe.mcp.tools.tasks import list_tasks
        await list_tasks(kind="plan")
    assert mock.call_args.kwargs["task_kind"] == "plan"


@pytest.mark.asyncio
async def test_list_tasks_kind_empty_means_no_filter():
    mock = AsyncMock(return_value=([], 0))
    with patch("scribe.mcp.tools.tasks.notes_svc.list_notes", mock):
        from scribe.mcp.tools.tasks import list_tasks
        await list_tasks()
    assert mock.call_args.kwargs["task_kind"] is None
