"""Tests for #220 — paperclip_client.get_predecessor_context ("seance").

Fakes an asyncpg connection so it never touches the live DB. Verifies the
limit clamp, row shaping (timestamps → isoformat), and the empty case.
"""

from __future__ import annotations

import asyncio
import os
import sys
from datetime import datetime
from pathlib import Path

import pytest

os.environ.setdefault("PAPERCLIP_DB_URL", "postgres://x:x@127.0.0.1:54329/paperclip")
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))  # web/

pc = pytest.importorskip("paperclip_client", reason="web deps unavailable")


class _FakeConn:
    def __init__(self, rows):
        self._rows = rows
        self.calls: list[tuple] = []

    async def fetch(self, query, *args):
        self.calls.append((query, args))
        return self._rows

    async def close(self):
        pass


def _row():
    return {
        "id": "run-1",
        "status": "succeeded",
        "started_at": datetime(2026, 7, 5, 10, 0, 0),
        "finished_at": datetime(2026, 7, 5, 10, 5, 0),
        "summary": "כתבתי בלוק ז — 3,206 מילים",
        "error_code": None,
        "session_id_after": "sess-abc",
        "agent_name": "writer",
    }


@pytest.fixture
def fake(monkeypatch):
    holder = {"rows": [_row()], "conn": None}

    async def _connect(_url):
        holder["conn"] = _FakeConn(holder["rows"])
        return holder["conn"]

    monkeypatch.setattr(pc.asyncpg, "connect", _connect)
    return holder


def test_shapes_runs_newest_first(fake):
    result = asyncio.run(pc.get_predecessor_context("iss-1"))
    assert result["ok"] is True and result["issue_id"] == "iss-1"
    (run,) = result["runs"]
    assert run["run_id"] == "run-1"
    assert run["status"] == "succeeded"
    assert run["started_at"] == "2026-07-05T10:00:00"
    assert run["finished_at"] == "2026-07-05T10:05:00"
    assert "בלוק ז" in run["summary"]
    assert run["session_id"] == "sess-abc"
    assert run["agent_name"] == "writer"


def test_limit_is_clamped(fake):
    asyncio.run(pc.get_predecessor_context("iss-1", limit=99))
    assert fake["conn"].calls[0][1] == ("iss-1", 10)  # clamped high
    asyncio.run(pc.get_predecessor_context("iss-1", limit=0))
    assert fake["conn"].calls[0][1] == ("iss-1", 1)  # clamped low


def test_empty(fake):
    fake["rows"] = []
    result = asyncio.run(pc.get_predecessor_context("ghost"))
    assert result == {"ok": True, "issue_id": "ghost", "runs": []}
