# Copyright 2024 The Pigweed Authors
#
# Licensed 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
#
#     https://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.
"""Bazel macros for launching the pw_system console."""

load("@bazel_skylib//rules:native_binary.bzl", "native_binary")

def device_simulator_console(
        name,
        script,
        host_binary,
        pw_console_config = None,
        socket_addr = "default",
        **kwargs):
    """Launch the host_binary and connect to it with the pw_system console.

    This macro is a wrapper around bazel_skylib native_binary to
    launch a device_sim.py script.

    Args:
      name: The name of this device_simulator_console rule.
      script: The py_binary target that calls upstream Pigweed's
        pw_console.device_sim main or main_with_compiled_protos. See:
        https://cs.opensource.google/pigweed/pigweed/+/main:pw_system/py/pw_system/device_sim.py
      host_binary: The host_device_simulator_binary target to run.
      socket_addr: Optional --socket-addr value to pass to pw-system-console.
      pw_console_config: Optional file group target containing a
        pw_console.yaml config file. For example:

          filegroup(
              name = "pw_console_config",
              srcs = [".pw_console.yaml"],
          )

      **kwargs: Passed to native_binary.
    """
    data = [host_binary]
    args = [
        "--sim-binary",
        "$(rootpath " + host_binary + ")",
        "--socket-addr",
        socket_addr,
    ]
    if pw_console_config:
        data.append(pw_console_config)
        args.append("--config-file")
        args.append("$(rootpath " + pw_console_config + ")")

    native_binary(
        name = name,
        src = script,
        args = args,
        data = data,
        # Note: out is mandatory in older bazel-skylib versions.
        out = name + ".exe",
        **kwargs
    )

def device_console(
        name,
        script,
        binary,
        baudrate = "115200",
        pw_console_config = None,
        **kwargs):
    """Connect to a device running the binary with the pw_system console.

    This macro is a wrapper around bazel_skylib native_binary to
    launch the console.py script with the basic set of arguments.

    Args:
      name: The name of this device_simulator_console rule.
      script: The py_binary target that calls upstream Pigweed's
        pw_system.console main or main_with_compiled_protos. See:
        https://cs.opensource.google/pigweed/pigweed/+/main:pw_system/py/pw_system/console.py
      binary: The binary to pass along to pw-system-console as the
        "--token-databases" argument.
      baudrate: Value to pass as the "--baudrate" arg to
        pw-system-console. Defaults to 115200.
      pw_console_config: Optional file group target containing a
        pw_console.yaml config file. For example:

          filegroup(
              name = "pw_console_config",
              srcs = [".pw_console.yaml"],
          )

      **kwargs: Passed to native_binary.
    """
    data = [binary]
    args = [
        "--baudrate",
        baudrate,
        "--token-databases",
        "$(rootpath " + binary + ")",
    ]
    if pw_console_config:
        data.append(pw_console_config)
        args.append("--config-file")
        args.append("$(rootpath " + pw_console_config + ")")

    native_binary(
        name = name,
        src = script,
        args = args,
        data = data,
        # Note: out is mandatory in older bazel-skylib versions.
        out = name + ".exe",
        **kwargs
    )
