# Copyright 2022 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.

import("//build_overrides/pi_pico.gni")
import("//build_overrides/pigweed.gni")

import("$dir_pw_arduino_build/arduino.gni")
import("$dir_pw_build/python.gni")
import("$dir_pw_build/python_dist.gni")
import("$dir_pw_build/python_venv.gni")
import("$dir_pw_third_party/mcuxpresso/mcuxpresso.gni")
import("$dir_pw_third_party/stm32cube/stm32cube.gni")
import("$dir_pw_tokenizer/database.gni")
import("$dir_pw_unit_test/test.gni")

# Lists all the targets build by default with e.g. `ninja -C out`.
group("default") {
  deps = [
    ":applications",
    ":arduino",
    ":host",
    ":mimxrt595_evk",
    ":pico",
    ":pw_experimental_python.lint",
    ":pw_experimental_python.tests",
    ":python.install",
  ]
}

# Group all targets that run on host only, e.g. tests, utils.
group("host") {
  deps = [
    ":host_tests(//targets/host:host_debug_tests)",
    "$dir_pw_color:tests.run(//targets/host:host_debug_tests)",
    "$dir_pw_display:tests.run(//targets/host:host_debug_tests)",
    "$dir_pw_draw:tests.run(//targets/host:host_debug_tests)",
    "$dir_pw_framebuffer:tests.run(//targets/host:host_debug_tests)",

    # See //applications/pw_lcd_display_host_imgui/README.md for instructions.
    "//applications/terminal_display:all(//targets/host:host_debug)",
  ]
}

# Arduino specific targets.
group("arduino") {
  if (pw_arduino_build_CORE_PATH != "") {
    deps = [ ":arduino_tests(//targets/arduino:arduino_debug_tests)" ]

    if (pw_arduino_build_CORE_NAME == "teensy") {
      deps += [
        # See //pw_lcd_display_teensy_ili9341/README.md for instructions.
        "//applications/terminal_display:all(//targets/arduino:arduino_debug)",
      ]
    }
  }
}

# This gn arg must be set to build for the rp2040
# PICO_SRC_DIR = "$HOME/pico-sdk"
group("pico") {
  if (PICO_SRC_DIR != "") {
    deps = [
      ":pico_tests(//targets/rp2040)",
      "//applications/terminal_display:all(//targets/rp2040)",
    ]
  }
}

group("mimxrt595_evk") {
  if (pw_third_party_mcuxpresso_SDK != "") {
    deps = [ "//applications/terminal_display:all(//targets/mimxrt595_evk:mimxrt595_evk_debug)" ]
  }
}

# stm32f429i_disc1 specific targets.
group("stm32f429i_disc1") {
  _default_toolchain = "//targets/stm32f429i_disc1:stm32f429i_disc1_debug"
  _testing_toolchain = "${_default_toolchain}_tests"
  deps = [
    # ":app(${_default_toolchain})",
    ":tests(${_testing_toolchain})",
  ]
}

# stm32f769i_disc0 specific targets.
group("stm32f769i_disc0") {
  _default_toolchain = "//targets/stm32f769i_disc0:stm32f769i_disc0_debug"
  _testing_toolchain = "${_default_toolchain}_tests"
  deps = [
    # ":app(${_default_toolchain})",
    ":tests(${_testing_toolchain})",
  ]
}

# This group is built during bootstrap to setup the interactive Python
# environment.
pw_python_group("python") {
  python_deps = [
    # Generate and pip install _all_python_packages
    ":pip_install_experimental_tools",
  ]
}

# In-tree Python packages
_pw_experimental_python_packages = [
  "//applications/tls_example/trust_store/py",
  "//tools:tools",
  "//pw_graphics/py",
]

# Pigweed Python packages to include
_pigweed_python_packages = [
  "$dir_pw_env_setup:core_pigweed_python_packages",
  "$dir_pigweed/targets/lm3s6965evb_qemu/py",
  "$dir_pigweed/targets/stm32f429i_disc1/py",
  "//targets/stm32f769i_disc0/py",
]

_all_python_packages =
    _pw_experimental_python_packages + _pigweed_python_packages

pw_python_group("pw_experimental_python") {
  python_deps = _pw_experimental_python_packages
}

# The default venv for Python actions in GN
# Set this gn arg in a declare_args block in this file 'BUILD.gn' or in '.gn' to
# use this venv.
#
#   pw_build_PYTHON_BUILD_VENV = "//:pw_experimental_build_venv"
#
pw_python_venv("pw_experimental_build_venv") {
  path = "$root_build_dir/python-venv"
  constraints = pw_build_PIP_CONSTRAINTS
  requirements = pw_build_PIP_REQUIREMENTS

  # Ensure all third party Python dependencies are installed into this venv.
  # This works by checking the setup.cfg files for all packages listed here and
  # installing the packages listed in the [options].install_requires field.
  source_packages = _all_python_packages
}

# This template collects all python packages and their dependencies into a
# single super Python package for installation into the bootstrapped virtual
# environment.
pw_create_python_source_tree(
    "generate_experimental_tools_python_distribution") {
  packages = _all_python_packages
  generate_setup_cfg = {
    name = "pw-experimental-tools"
    version = "0.0.1"
    append_date_to_version = true
    include_default_pyproject_file = true
  }
}

# Install the pw-experimental-tools super Python package into the bootstrapped
# Python venv.
pw_internal_pip_install("pip_install_experimental_tools") {
  packages = [ ":generate_experimental_tools_python_distribution" ]
}

group("applications") {
  deps = []

  # Teensy 3.0/4.0 applications steps.
  if (pw_arduino_build_CORE_PATH != "") {
    deps += [
      ":applications_tests(//targets/arduino:arduino_debug_tests)",
      "//applications/blinky:blinky(//targets/arduino:arduino_debug)",
      "//applications/rpc:all(//targets/arduino:arduino_debug)",
      "//applications/strings:all(//targets/arduino:arduino_debug)",
    ]

    # TODO(b/258827934): Fix size report and reenable.
    if (pw_arduino_build_CORE_NAME == "teensy-<disabled>") {
      deps += [
        "//applications/tls_example:boringssl_teensy_ethernet(//targets/arduino:arduino_debug)",
        "//applications/tls_example:mbedtls_teensy_ethernet(//targets/arduino:arduino_debug)",
        "//applications/tls_example:picotls_teensy_ethernet(//targets/arduino:arduino_debug)",
      ]
    }
  }

  # Raspberry Pi Pico
  if (PICO_SRC_DIR != "") {
    deps += [
      ":applications_tests(//targets/rp2040)",
      "//applications/blinky:blinky(//targets/rp2040)",
      "//applications/rpc:all(//targets/rp2040)",
      "//applications/strings:all(//targets/rp2040)",
    ]
  }

  # MIMXRT595-EVK application steps.
  if (pw_third_party_mcuxpresso_SDK != "") {
    deps += [
      ":applications_tests(//targets/mimxrt595_evk:mimxrt595_evk_debug)",
      "//applications/blinky:blinky(//targets/mimxrt595_evk:mimxrt595_evk_debug)",
      "//applications/rpc:all(//targets/mimxrt595_evk:mimxrt595_evk_debug)",
      "//applications/strings:all(//targets/mimxrt595_evk:mimxrt595_evk_debug)",
      "//applications/terminal_display:all(//targets/mimxrt595_evk:mimxrt595_evk_debug)",
    ]
  }

  if (dir_pw_third_party_stm32cube_f4 != "") {
    # STMicroelectronics STM32F429I-DISC1 applications steps.
    deps += [
      ":applications_tests(//targets/stm32f429i_disc1:stm32f429i_disc1_debug_tests)",
      "//applications/blinky:blinky(//targets/stm32f429i_disc1:stm32f429i_disc1_debug)",
      "//applications/rpc:all(//targets/stm32f429i_disc1:stm32f429i_disc1_debug)",
      "//applications/strings:all(//targets/stm32f429i_disc1:stm32f429i_disc1_debug)",
    ]

    # STMicroelectronics STM32F429I-DISC1 STM32Cube applications steps.
    deps += [
      ":applications_tests(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube_debug)",
      "//applications/blinky:blinky(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube_debug)",
      "//applications/terminal_display:all(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube_debug)",
    ]

    # STMicroelectronics STM32F439ZI-Nucleo applications steps.
    deps += [
      ":applications_tests(//targets/stm32f439zi_nucleo:stm32f439zi_nucleo_debug)",
      "//applications/blinky:blinky(//targets/stm32f439zi_nucleo:stm32f439zi_nucleo_debug)",
    ]
  }

  if (dir_pw_third_party_stm32cube_f2 != "") {
    deps += [ "//applications/blinky:blinky(//targets/stm32f207zg-nucleo:stm32f207zg_nucleo_debug)" ]
  }

  if (dir_pw_third_party_stm32cube_f7 != "") {
    # STMicroelectronics STM32F769I-DISC0 applications steps.
    deps += [
      ":applications_tests(//targets/stm32f769i_disc0:stm32f769i_disc0_debug_tests)",
      "//applications/blinky:blinky(//targets/stm32f769i_disc0:stm32f769i_disc0_debug)",
      "//applications/rpc:all(//targets/stm32f769i_disc0:stm32f769i_disc0_debug)",
      "//applications/strings:all(//targets/stm32f769i_disc0:stm32f769i_disc0_debug)",
    ]

    # STMicroelectronics STM32F769I-DISC0 STM32Cube applications steps.
    deps += [
      ":applications_tests(//targets/stm32f769i_disc0_stm32cube:stm32f769i_disc0_stm32cube_debug)",
      "//applications/blinky:blinky(//targets/stm32f769i_disc0_stm32cube:stm32f769i_disc0_stm32cube_debug)",
    ]
  }

  if (dir_pw_third_party_stm32cube_l5 != "") {
    deps += [ "//applications/blinky:blinky(//targets/stm32l552ze-nucleo:stm32l552ze_nucleo_debug)" ]
  }

  if (dir_pw_third_party_stm32cube_h7 != "") {
    deps += [ "//applications/blinky:blinky(//targets/stm32h753zi-nucleo:stm32h753zi_nucleo_debug)" ]
  }

  # Host applications steps.
  deps += [
    ":applications_tests(//targets/host:host_debug_tests)",
    "//applications/blinky:blinky(//targets/host:host_debug)",
    "//applications/strings:all(//targets/host:host_debug)",
  ]
}

# Group the different modules tests together.
pw_test_group("tests") {
  group_deps = [
    "//applications/strings:tests",
    "//applications/terminal_display:tests",
  ]

  if (pw_arduino_build_CORE_NAME == "teensy") {
    group_deps += []
  }
}

# Test groups for each platform that will build and optionally run the tests.
foreach(test_group,
        [
          "arduino",
          "pico",
          "mimxrt595_evk",
          "host",
          "applications",
        ]) {
  group("${test_group}_tests") {
    deps = []
    if (pw_unit_test_AUTOMATIC_RUNNER == "" || test_group != "host") {
      # Without a test runner defined, build the tests but don't run them.
      deps += [ ":tests" ]
    } else {
      # With a test runner, build and run tests.
      deps += [ ":tests.run" ]
    }
  }
}
