"""'unsloth studio' CLI must default --host to 127.0.0.1. AST-based, no typer/pydantic needed."""

import ast
from pathlib import Path

_STUDIO_CMD_PY = Path(__file__).resolve().parents[2] / "unsloth_cli" / "commands" / "studio.py"


def _find_typer_option_default(source: str, func_name: str, long_option: str):
    """Return the typer.Option default for *long_option* in *func_name* (ast.Constant defaults only)."""
    tree = ast.parse(source)
    for func_node in ast.walk(tree):
        if not isinstance(func_node, (ast.FunctionDef, ast.AsyncFunctionDef)):
            continue
        if func_node.name != func_name:
            continue
        all_args = func_node.args.args + func_node.args.kwonlyargs
        all_defaults = func_node.args.defaults + [
            d for d in func_node.args.kw_defaults if d is not None
        ]
        for default in all_defaults:
            if not isinstance(default, ast.Call):
                continue
            call_func = default.func
            is_typer_option = (
                isinstance(call_func, ast.Attribute)
                and call_func.attr == "Option"
                and isinstance(call_func.value, ast.Name)
                and call_func.value.id == "typer"
            )
            if not is_typer_option:
                continue
            # First positional is the default; the rest are flags.
            if not default.args:
                continue
            flags = [
                a.value
                for a in default.args[1:]
                if isinstance(a, ast.Constant) and isinstance(a.value, str)
            ]
            if long_option not in flags:
                continue
            first = default.args[0]
            if isinstance(first, ast.Constant):
                return first.value
    return None


def test_studio_default_host_is_loopback():
    """`unsloth studio` (studio_default) --host default must be 127.0.0.1."""
    source = _STUDIO_CMD_PY.read_text()
    host_default = _find_typer_option_default(source, "studio_default", "--host")
    assert (
        host_default is not None
    ), "Could not find --host typer.Option default in studio_default()"
    assert host_default == "127.0.0.1", (
        f"studio_default() --host default must be '127.0.0.1' (loopback) "
        f"but got '{host_default}'."
    )


def test_studio_run_host_is_loopback():
    """`unsloth studio run` --host default must be 127.0.0.1."""
    source = _STUDIO_CMD_PY.read_text()
    host_default = _find_typer_option_default(source, "run", "--host")
    assert host_default is not None, "Could not find --host typer.Option default in run()"
    assert host_default == "127.0.0.1", (
        f"`unsloth studio run` --host default must be '127.0.0.1' (loopback) "
        f"but got '{host_default}'."
    )
