"""Read a resource and obtain a prompt without calling a language model."""
import asyncio
import json
from mcp.shared.exceptions import McpError
from lab_session import lab_session

RULES = "A label contains 1 to 80 characters after trimming. Internal spaces are preserved."


async def main():
    async with lab_session("context_server.py") as (session, _):
        resources = await session.list_resources()
        assert [str(resource.uri) for resource in resources.resources] == ["workshop://rules"]
        rules = await session.read_resource("workshop://rules")
        assert rules.contents[0].text == RULES
        prompts = await session.list_prompts()
        assert [prompt.name for prompt in prompts.prompts] == ["review_label"]
        prompt = await session.get_prompt("review_label", {"text": "Draft"})
        assert prompt.messages[0].role == "user"
        assert prompt.messages[0].content.text == f"Explain this label using these rules: {RULES}\nLabel: Draft"
        errors = {}
        for name, action in [("missing_resource", lambda: session.read_resource("workshop://missing")), ("missing_prompt_argument", lambda: session.get_prompt("review_label", {}))]:
            try:
                await action()
            except McpError as error:
                errors[name] = {"code": error.error.code, "message": error.error.message}
            else:
                raise AssertionError("Expected an MCP error for " + name)
        print("PASS: resource read, prompt get, two expected errors")
        print(json.dumps({"resource": rules.model_dump(mode="json", exclude_none=True), "prompt": prompt.model_dump(mode="json", exclude_none=True), "known_errors": errors}, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    asyncio.run(main())
