############################################################################
# tools/pynuttx/gdbrpc/cli.py
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.  The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################

import logging

from gdbrpc.client import Client
from gdbrpc.utils import ShellExec


class ClientCLI(Client):
    def __init__(self, host, port):
        super().__init__(host, port, log_level=logging.WARNING)

    def _show_command_help(self):
        print("Welcome to the GDB Remote Protocol Client")
        print("Type `exit` or `quit` to disconnect.")
        print("Type `help` to show this help message.")
        print("If you need `interrupt` command to stop the target, use Ctrl+C.")

    def _loop(self):
        print("gdb> ", end="", flush=True)
        while True:
            try:
                command = input().strip()
                if not command:
                    continue
                if command.lower() in ("exit", "quit"):
                    self.disconnect()
                    break
                if command.lower() == "help":
                    self._show_command_help()
                    print("gdb> ", end="", flush=True)
                    continue
                print(self.call(ShellExec(command)))
                print("gdb> ", end="", flush=True)
            except KeyboardInterrupt:
                print("")
                self.call(ShellExec("interrupt"))
                print("gdb> ", end="", flush=True)
            except EOFError:
                self.disconnect()

    def start(self):
        assert self.connect()
        self._show_command_help()
        self._loop()