# Copyright 2026 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
from typing import Any

from cli.commands.base import BaseCommand


class Command(BaseCommand):
    COMMAND_NAME = "evaluate"

    @staticmethod
    def register_cli(subparsers: Any) -> None:
        evaluate_parser = subparsers.add_parser(
            Command.COMMAND_NAME,
            aliases=["print"],
            help="Evaluate an expression in a stack frame.",
            description=(
                "Evaluate an expression in the context of a stack frame."
            ),
        )
        evaluate_parser.add_argument(
            "--thread-id",
            type=int,
            required=True,
            help="Thread ID to query",
        )
        evaluate_parser.add_argument(
            "--frame-index",
            type=int,
            default=0,
            help="Frame index within the stacktrace (defaults to 0)",
        )
        evaluate_parser.add_argument(
            "--start",
            type=int,
            default=0,
            help="Index of the first child variable to retrieve (defaults to 0)",
        )
        evaluate_parser.add_argument(
            "--count",
            type=int,
            default=50,
            help="Number of child variables to retrieve (defaults to 50)",
        )
        evaluate_parser.add_argument(
            "expression",
            nargs="+",
            help="Expression to evaluate",
        )

    @staticmethod
    async def execute(args: argparse.Namespace) -> int | None:
        # TODO(https://fxbug.dev/527992704): Handle expression evaluation vs generic console commands
        # appropriately once zxdb evaluate handler is restricted to expressions only.
        if isinstance(args.expression, list):
            args.expression = " ".join(args.expression)
        return None
