"""Classify a configuration; exercise HTTP syntax without a network call."""
import asyncio
import json
from pathlib import Path
from urllib.parse import urlsplit
from lab_session import lab_session


def classify(configuration: dict) -> str:
    has_command = bool(configuration.get("command"))
    has_url = bool(configuration.get("url"))
    if has_command == has_url:
        raise ValueError("Provide exactly one of command or url")
    if has_command:
        if configuration.get("type", "stdio") != "stdio":
            raise ValueError("A command uses stdio in this exercise")
        return "stdio"
    url = urlsplit(configuration["url"])
    if url.scheme != "https" or not url.hostname or url.username or url.password:
        raise ValueError("Use an HTTPS endpoint without credentials in its URL")
    return "streamable-http"


async def main():
    root = Path(__file__).resolve().parent
    configuration = json.loads((root / ".mcp.json").read_text(encoding="utf-8"))["mcpServers"]["label-lab"]
    assert classify(configuration) == "stdio"
    async with lab_session() as (session, initialized):
        assert initialized.protocolVersion == "2025-11-25"
        assert (await session.list_tools()).tools[0].name == "normalize_label"
    hypothetical_http = {"url": "https://example.invalid/mcp"}
    assert classify(hypothetical_http) == "streamable-http"
    bad_configurations = [{}, {"command": "python", "url": "https://example.invalid/mcp"}, {"url": "http://example.invalid/mcp"}]
    errors = []
    for bad in bad_configurations:
        try:
            classify(bad)
        except ValueError as error:
            errors.append(str(error))
        else:
            raise AssertionError("Expected a configuration error")
    print("PASS: real stdio handshake; HTTP configuration only; three invalid configurations")
    print(json.dumps({"local": {"transport": "stdio", "protocol": initialized.protocolVersion, "messages": ["initialize", "notifications/initialized", "tools/list"]}, "http_exercise": {"transport": classify(hypothetical_http), "endpoint": hypothetical_http["url"], "server_implemented": False, "authorization_implemented": False, "network_called": False}, "configuration_errors": errors}, ensure_ascii=False, indent=2))


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