"""Tests for the description-field roundtrip through the notes service.

The description field is the user-stated goal/context on a task; distinct
from `body` which (post-Task-as-Durable-Record) becomes the LLM-maintained
consolidation summary.
"""
from unittest.mock import AsyncMock, MagicMock, patch
from tests.helpers import make_mock_session


def _mock_session_for_update(mock_note):
    mock_session = make_mock_session()
    mock_result = MagicMock()
    mock_result.scalars.return_value.first.return_value = mock_note
    mock_session.execute = AsyncMock(return_value=mock_result)
    mock_session.commit = AsyncMock()
    mock_session.refresh = AsyncMock()
    return mock_session


async def test_update_note_persists_description():
    """update_note(description=...) should assign to note.description.

    update_note already accepts **fields and uses setattr, so this exercises
    that the new model column is reachable through the existing dynamic-fields
    path (no service-layer change required beyond the model column).
    """
    mock_note = MagicMock()
    # Pre-existing state — None description, no recurrence, status untouched.
    mock_note.description = None
    mock_note.status = None
    mock_note.recurrence_rule = None
    mock_note.project_id = None

    with patch(
        "scribe.services.notes.async_session",
        return_value=_mock_session_for_update(mock_note),
    ):
        from scribe.services.notes import update_note
        await update_note(1, 1, description="the goal text")

    assert mock_note.description == "the goal text"


async def test_create_note_forwards_description_to_model():
    """create_note(description=...) should pass description into the Note
    constructor so it gets persisted alongside title/body/etc."""
    captured: dict = {}

    class FakeNote:
        def __init__(self, **kw):
            captured.update(kw)
            self.id = 1
            self.project_id = kw.get("project_id")
            for k, v in kw.items():
                setattr(self, k, v)

    mock_session = make_mock_session()
    mock_session.add = MagicMock()
    mock_session.commit = AsyncMock()
    mock_session.refresh = AsyncMock()

    with patch(
        "scribe.services.notes.async_session", return_value=mock_session
    ), patch("scribe.services.notes.Note", FakeNote):
        from scribe.services.notes import create_note
        await create_note(
            user_id=1, title="renew cert", description="the goal text",
        )

    assert captured.get("description") == "the goal text"
