"""Basic tests for list_prompts, list_resources, and list_tools handlers without pagination."""

import pytest
from mcp_types import (
    ListPromptsResult,
    ListResourcesResult,
    ListToolsResult,
    PaginatedRequestParams,
    Prompt,
    Resource,
    Tool,
)

from mcp import Client
from mcp.server import Server, ServerRequestContext


@pytest.mark.anyio
async def test_list_prompts_basic() -> None:
    """Test basic prompt listing without pagination."""
    test_prompts = [
        Prompt(name="prompt1", description="First prompt"),
        Prompt(name="prompt2", description="Second prompt"),
    ]

    async def handle_list_prompts(
        ctx: ServerRequestContext, params: PaginatedRequestParams | None
    ) -> ListPromptsResult:
        return ListPromptsResult(prompts=test_prompts)

    server = Server("test", on_list_prompts=handle_list_prompts)
    async with Client(server) as client:
        result = await client.list_prompts()
        assert result.prompts == test_prompts


@pytest.mark.anyio
async def test_list_resources_basic() -> None:
    """Test basic resource listing without pagination."""
    test_resources = [
        Resource(uri="file:///test1.txt", name="Test 1"),
        Resource(uri="file:///test2.txt", name="Test 2"),
    ]

    async def handle_list_resources(
        ctx: ServerRequestContext, params: PaginatedRequestParams | None
    ) -> ListResourcesResult:
        return ListResourcesResult(resources=test_resources)

    server = Server("test", on_list_resources=handle_list_resources)
    async with Client(server) as client:
        result = await client.list_resources()
        assert result.resources == test_resources


@pytest.mark.anyio
async def test_list_tools_basic() -> None:
    """Test basic tool listing without pagination."""
    test_tools = [
        Tool(
            name="tool1",
            description="First tool",
            input_schema={
                "type": "object",
                "properties": {
                    "message": {"type": "string"},
                },
                "required": ["message"],
            },
        ),
        Tool(
            name="tool2",
            description="Second tool",
            input_schema={
                "type": "object",
                "properties": {
                    "count": {"type": "number"},
                    "enabled": {"type": "boolean"},
                },
                "required": ["count"],
            },
        ),
    ]

    async def handle_list_tools(ctx: ServerRequestContext, params: PaginatedRequestParams | None) -> ListToolsResult:
        return ListToolsResult(tools=test_tools)

    server = Server("test", on_list_tools=handle_list_tools)
    async with Client(server) as client:
        result = await client.list_tools()
        assert result.tools == test_tools


@pytest.mark.anyio
async def test_list_prompts_empty() -> None:
    """Test listing with empty results."""

    async def handle_list_prompts(
        ctx: ServerRequestContext, params: PaginatedRequestParams | None
    ) -> ListPromptsResult:
        return ListPromptsResult(prompts=[])

    server = Server("test", on_list_prompts=handle_list_prompts)
    async with Client(server) as client:
        result = await client.list_prompts()
        assert result.prompts == []


@pytest.mark.anyio
async def test_list_resources_empty() -> None:
    """Test listing with empty results."""

    async def handle_list_resources(
        ctx: ServerRequestContext, params: PaginatedRequestParams | None
    ) -> ListResourcesResult:
        return ListResourcesResult(resources=[])

    server = Server("test", on_list_resources=handle_list_resources)
    async with Client(server) as client:
        result = await client.list_resources()
        assert result.resources == []


@pytest.mark.anyio
async def test_list_tools_empty() -> None:
    """Test listing with empty results."""

    async def handle_list_tools(ctx: ServerRequestContext, params: PaginatedRequestParams | None) -> ListToolsResult:
        return ListToolsResult(tools=[])

    server = Server("test", on_list_tools=handle_list_tools)
    async with Client(server) as client:
        result = await client.list_tools()
        assert result.tools == []
