# 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 += [
        # TODO(tonymd): pw_framebuffer_pool depends on
        # "pw_sync/counting_semaphore.h". Teensy does not have a implementation
        # for that yet.
        # 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" ]
    }
  }
}
