# Copyright 2025 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 asyncio
import sys

import package_server


async def main(args: list[str] = sys.argv[1:]) -> int:
    async with package_server.ensure_running():
        # TODO(https://fxbug.dev/464692993): Refactor `//scripts/fxtest/python/debugger.py` into a
        # shared library and use it here.
        ffx_cmd = await asyncio.subprocess.create_subprocess_exec(
            "ffx", "debug", "connect", *args, stdin=sys.stdin
        )

        try:
            return await ffx_cmd.wait()
        except asyncio.CancelledError:
            # This block triggers if the python script receives SIGINT (Ctrl+C)
            # or SIGTERM, and zxdb hasn't already exited.

            # Gracefully shutdown zxdb.
            ffx_cmd.terminate()

            # Give zxdb a few seconds to clean up internal state
            await asyncio.wait_for(ffx_cmd.wait(), timeout=3.0)

            # Forcefully kill zxdb if it hasn't stopped yet.
            if ffx_cmd.returncode is None:
                ffx_cmd.kill()
                await ffx_cmd.wait()
                return -9

            return ffx_cmd.returncode


if __name__ == "__main__":
    sys.exit(asyncio.run(main()))
