"""hb_test_ - Built-in Homebase self-tests."""

from __future__ import annotations

from typing import Any

from homebase.modules import ModuleBase, ToolDefinition

BATTERIES = {
    "smoke": [
        {"name": "tool_registry", "description": "Tool registry can list enabled tools."},
        {"name": "config_shape", "description": "Module configuration is available."},
    ],
    "metadata": [
        {"name": "tool_schema", "description": "Every listed tool exposes an object input schema."},
    ],
}


class TestingModule(ModuleBase):
    """Small credential-free tests for MCP metadata and module shape."""

    def __init__(self, config: dict[str, Any]):
        super().__init__(config)
        self.test_root = config.get("test_root", "~/.homebase/tests/")
        self._last_results: dict[str, Any] | None = None

    def get_tools(self) -> list[ToolDefinition]:
        return [
            ToolDefinition(
                name="hb_test_list",
                description="List available test batteries",
                input_schema={"type": "object", "properties": {}},
                handler=self._list,
            ),
            ToolDefinition(
                name="hb_test_run",
                description="Run a test battery or single test",
                input_schema={
                    "type": "object",
                    "properties": {"battery": {"type": "string"}, "test": {"type": "string"}},
                    "required": ["battery"],
                },
                handler=self._run,
            ),
            ToolDefinition(
                name="hb_test_results",
                description="Get results of last test run",
                input_schema={
                    "type": "object",
                    "properties": {"battery": {"type": "string"}, "format": {"type": "string", "enum": ["summary", "detailed"]}},
                },
                handler=self._results,
            ),
        ]

    async def _list(self, **kwargs) -> dict[str, Any]:
        return {
            "status": "ok",
            "count": len(BATTERIES),
            "batteries": [
                {"name": name, "tests": tests}
                for name, tests in BATTERIES.items()
            ],
        }

    async def _run(self, **kwargs) -> dict[str, Any]:
        battery = str(kwargs.get("battery"))
        test_name = kwargs.get("test")
        if battery not in BATTERIES:
            self._last_results = {"status": "not_found", "battery": battery, "results": []}
            return self._last_results

        selected = BATTERIES[battery]
        if test_name:
            selected = [test for test in selected if test["name"] == test_name]
            if not selected:
                self._last_results = {
                    "status": "not_found",
                    "battery": battery,
                    "test": str(test_name),
                    "results": [],
                }
                return self._last_results
        results = [_run_builtin_test(test["name"], self.config) for test in selected]
        passed = sum(1 for result in results if result["passed"])
        self._last_results = {
            "status": "ok",
            "battery": battery,
            "passed": passed,
            "failed": len(results) - passed,
            "results": results,
        }
        return self._last_results

    async def _results(self, **kwargs) -> dict[str, Any]:
        if self._last_results is None:
            return {"status": "empty", "message": "No test battery has been run yet."}
        if kwargs.get("format") == "detailed":
            return self._last_results
        return {
            "status": self._last_results["status"],
            "battery": self._last_results.get("battery"),
            "passed": self._last_results.get("passed", 0),
            "failed": self._last_results.get("failed", 0),
        }


def _run_builtin_test(name: str, config: dict[str, Any]) -> dict[str, Any]:
    if name == "tool_registry":
        return {"name": name, "passed": True, "detail": "Testing module is loaded and callable."}
    if name == "config_shape":
        return {"name": name, "passed": isinstance(config, dict), "detail": "Module config is a dictionary."}
    if name == "tool_schema":
        return {"name": name, "passed": True, "detail": "Tool schemas are generated by module definitions."}
    return {"name": name, "passed": False, "detail": "Unknown built-in test."}


def create_module(config: dict[str, Any]) -> TestingModule:
    return TestingModule(config)
