def test_capture_confirm_federation(client):
    cap = client.post(
        "/api/inbox/capture",
        json={"kind": "text", "raw": "다음 주에 한국 놀러가는 비행기 티켓 사기"},
    ).json()
    iid = cap["item"]["id"]
    assert cap["classification"]["type"] == "task"
    conf = client.post(f"/api/inbox/{iid}/confirm").json()
    assert conf["item"]["status"] == "confirmed"
    assert conf["item"]["materialized_task_id"]
    assert conf["task"]["title"].startswith("다음 주에 한국")
    # extra(가격 추적 알림)가 notes 에 포함
    assert "가격 추적" in conf["task"]["notes"]


def test_reclassify_force(client):
    cap = client.post(
        "/api/inbox/capture", json={"kind": "text", "raw": "엄마 생신 선물 알아보기"}
    ).json()
    iid = cap["item"]["id"]
    re = client.post(f"/api/inbox/{iid}/reclassify", json={"type": "idea"}).json()
    assert re["type"] == "idea"


def test_dismiss(client):
    cap = client.post("/api/inbox/capture", json={"kind": "text", "raw": "잡담"}).json()
    iid = cap["item"]["id"]
    assert client.post(f"/api/inbox/{iid}/dismiss").json()["status"] == "dismissed"


def test_capture_model_is_heuristic(client):
    # 테스트는 휴리스틱 강제 → model 표기 heuristic
    cap = client.post(
        "/api/inbox/capture", json={"kind": "text", "raw": "수요일 11시 자전거 수리"}
    ).json()
    assert cap["classification"]["model"] == "heuristic"


def test_confirm_event_no_task(client):
    # event 는 confirm 시 task 미생성, 상태만 confirmed
    cap = client.post(
        "/api/inbox/capture", json={"kind": "text", "raw": "수요일 11시 자전거 수리 맡기기"}
    ).json()
    iid = cap["item"]["id"]
    conf = client.post(f"/api/inbox/{iid}/confirm").json()
    assert conf["item"]["status"] == "confirmed"
    assert conf["item"]["materialized_task_id"] is None
    assert conf["task"] is None
