"""Hatchling build hook that compiles and bundles the Go TUI sidecar."""

from __future__ import annotations

import os
import shutil
import subprocess
import sysconfig
from pathlib import Path
from typing import Any

from hatchling.builders.hooks.plugin.interface import BuildHookInterface


class CustomBuildHook(BuildHookInterface):  # type: ignore[type-arg]
    """Compile the Bubble Tea sidecar and ship it inside the wheel.

    The sidecar is the only interactive interface, so every wheel is a
    platform wheel and a missing Go toolchain is a build failure.
    """

    def initialize(self, version: str, build_data: dict[str, Any]) -> None:
        # Editable installs run from the checkout, where the TUI is started
        # with ``go run``; there is nothing to bundle.
        if version == "editable":
            return

        root = Path(self.root)
        executable = "strix-tui.exe" if os.name == "nt" else "strix-tui"
        output = root / "build" / "sidecar" / executable
        output.parent.mkdir(parents=True, exist_ok=True)

        go = shutil.which("go")
        if go is None:
            raise RuntimeError("Go 1.24 or newer is required to build the Bubble Tea TUI")
        env = os.environ.copy()
        env["CGO_ENABLED"] = "0"
        subprocess.run(  # noqa: S603 - fixed build command using the resolved Go binary
            [
                go,
                "build",
                "-trimpath",
                "-ldflags=-s -w",
                "-o",
                str(output),
                "./cmd/strix-tui",
            ],
            cwd=root / "strix" / "interface" / "tui",
            env=env,
            check=True,
        )

        build_data["force_include"][str(output)] = f"strix/bin/{executable}"
        build_data["pure_python"] = False
        platform_tag = os.environ.get("STRIX_WHEEL_PLATFORM_TAG")
        if not platform_tag:
            platform_tag = sysconfig.get_platform().replace("-", "_").replace(".", "_")
        build_data["tag"] = f"py3-none-{platform_tag}"
