"""Тесты M5: MCP-инструменты и авторизация /mcp."""

import pytest
from fastapi.testclient import TestClient

from app import mcp_server
from app.main import app
from tests.conftest import MCP_TOKEN  # type: ignore[attr-defined]


def test_mcp_create_and_get_task(client: TestClient) -> None:
    created = mcp_server.create_task("Задача от агента", description="описание")
    assert created["detail_state"] == "raw"

    full = mcp_server.get_task(created["id"])
    assert full["title"] == "Задача от агента"
    assert full["description"] == "описание"
    assert full["attachments"] == []


def test_mcp_update_and_complete(client: TestClient) -> None:
    created = mcp_server.create_task("x")
    updated = mcp_server.update_task(created["id"], priority=8)
    assert updated["priority"] == 8

    done = mcp_server.complete_task(created["id"], actual_minutes=25)
    assert done["status"] == "done"

    full = mcp_server.get_task(created["id"])
    assert full["actual_minutes"] == 25
    assert full["done_at"] is not None


def test_mcp_unknown_refs_rejected(client: TestClient) -> None:
    with pytest.raises(ValueError, match="not found"):
        mcp_server.create_task("x", project_id=999)
    with pytest.raises(ValueError, match="not found"):
        mcp_server.create_task("x", parent_task_id=999)
    tid = mcp_server.create_task("x")["id"]
    with pytest.raises(ValueError, match="Unknown status"):
        mcp_server.update_task(tid, status="unknown")


def test_mcp_list_and_search(client: TestClient) -> None:
    a = mcp_server.create_task("Помыть окна")
    b = mcp_server.create_task("Купить шторы")

    all_tasks = mcp_server.list_tasks(detail_state="raw")
    assert [t["id"] for t in all_tasks] == [b["id"], a["id"]]  # свежие первыми

    found = mcp_server.list_tasks(query="окн")
    assert [t["id"] for t in found] == [a["id"]]

    by_status = mcp_server.list_tasks(status="done")
    assert by_status == []


def test_mcp_requires_bearer_token() -> None:
    # Этот тест — единственный, где запускается lifespan (MCP session manager)
    with TestClient(app) as client:
        # без токена
        assert client.post("/mcp", json={}).status_code == 401
        # неверный токен
        resp = client.post(
            "/mcp", json={}, headers={"Authorization": "Bearer wrong-token"}
        )
        assert resp.status_code == 401
        # верный токен — проходит аутентификацию (ошибки протокола — не 401)
        resp = client.post(
            "/mcp",
            json={"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {}},
            headers={"Authorization": f"Bearer {MCP_TOKEN}"},
        )
        assert resp.status_code != 401
