# Copyright (c) 2018 Open Source Foundries Limited.
# Copyright 2019 Foundries.io
# Copyright (c) 2020 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0

'''west "debug", "debugserver", and "attach" commands.'''

from textwrap import dedent

from west.commands import WestCommand

from run_common import desc_common, add_parser_common, do_run_common


class Debug(WestCommand):

    def __init__(self):
        super(Debug, self).__init__(
            'debug',
            # Keep this in sync with the string in west-commands.yml.
            'flash and interactively debug a Zephyr application',
            dedent('''
            Connect to the board, flash the program, and start a
            debugging session. Use "west attach" instead to attach
            a debugger without reflashing.\n\n''') +
            desc_common('debug'),
            accepts_unknown_args=True)
        self.runner_key = 'debug-runner'  # in runners.yaml

    def do_add_parser(self, parser_adder):
        return add_parser_common(self, parser_adder)

    def do_run(self, my_args, runner_args):
        do_run_common(self, my_args, runner_args)


class DebugServer(WestCommand):

    def __init__(self):
        super(DebugServer, self).__init__(
            'debugserver',
            # Keep this in sync with the string in west-commands.yml.
            'connect to board and launch a debug server',
            dedent('''
            Connect to the board and launch a debug server which accepts
            incoming connections for debugging the connected board.

            The debug server binds to a known port, and allows client software
            started elsewhere to connect to it and debug the running
            Zephyr image.\n\n''') +
            desc_common('debugserver'),
            accepts_unknown_args=True)
        self.runner_key = 'debug-runner'  # in runners.yaml

    def do_add_parser(self, parser_adder):
        return add_parser_common(self, parser_adder)

    def do_run(self, my_args, runner_args):
        do_run_common(self, my_args, runner_args)


class Attach(WestCommand):

    def __init__(self):
        super(Attach, self).__init__(
            'attach',
            # Keep this in sync with the string in west-commands.yml.
            'interactively debug a board',
            "Like \"west debug\", but doesn't reflash the program.\n\n" +
            desc_common('attach'),
            accepts_unknown_args=True)
        self.runner_key = 'debug-runner'  # in runners.yaml

    def do_add_parser(self, parser_adder):
        return add_parser_common(self, parser_adder)

    def do_run(self, my_args, runner_args):
        do_run_common(self, my_args, runner_args)
