# Copyright (c) Microsoft. All rights reserved.

"""Agent Lightning command line interface entry point."""

from __future__ import annotations

import argparse
import importlib
import sys
from typing import Dict, Iterable, Tuple

_SUBCOMMANDS: Dict[str, Tuple[str, str]] = {
    "vllm": ("agentlightning.cli.vllm", "Run the vLLM CLI with Agent Lightning instrumentation."),
    "store": ("agentlightning.cli.store", "Run a LightningStore server."),
    "prometheus": ("agentlightning.cli.prometheus", "Serve Prometheus metrics from the multiprocess registry."),
    "agentops": ("agentlightning.cli.agentops_server", "Start the AgentOps server manager."),
}

_DESCRIPTION = "Agent Lightning CLI entry point.\n\nAvailable subcommands:\n" + "\n".join(
    f"  {name:<10}{desc}" for name, (_, desc) in _SUBCOMMANDS.items()
)


def main(argv: Iterable[str] | None = None) -> int:
    """Dispatch to the requested Agent Lightning subcommand."""
    parser = argparse.ArgumentParser(
        prog="agl",
        description=_DESCRIPTION,
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    parser.add_argument("subcommand", choices=_SUBCOMMANDS.keys(), help="Subcommand to run.")
    parser.add_argument("args", nargs=argparse.REMAINDER, help=argparse.SUPPRESS)

    parsed = parser.parse_args(list(argv) if argv is not None else None)
    module_name, _ = _SUBCOMMANDS[parsed.subcommand]
    module = importlib.import_module(module_name)

    entry_point = getattr(module, "main", None)
    if entry_point is None:
        parser.error(f"Subcommand '{parsed.subcommand}' does not define a callable 'main'")

    dispatch_args = parsed.args
    original_argv = sys.argv
    sys.argv = [f"{parser.prog} {parsed.subcommand}", *dispatch_args]
    try:
        result = entry_point(dispatch_args or None)
    finally:
        sys.argv = original_argv

    if isinstance(result, int):
        return result
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
