set(source_files
    helper/adhoc-aloha-noack-ideal-phy-helper.cc
    helper/spectrum-analyzer-helper.cc
    helper/spectrum-helper.cc
    helper/tv-spectrum-transmitter-helper.cc
    helper/waveform-generator-helper.cc
    model/aloha-noack-mac-header.cc
    model/aloha-noack-net-device.cc
    model/constant-spectrum-propagation-loss.cc
    model/friis-spectrum-propagation-loss.cc
    model/half-duplex-ideal-phy-signal-parameters.cc
    model/half-duplex-ideal-phy.cc
    model/hexagonal-wraparound-model.cc
    model/ism-spectrum-value-helper.cc
    model/matrix-based-channel-model.cc
    model/microwave-oven-spectrum-value-helper.cc
    model/multi-model-spectrum-channel.cc
    model/non-communicating-net-device.cc
    model/phased-array-spectrum-propagation-loss-model.cc
    model/single-model-spectrum-channel.cc
    model/spectrum-analyzer.cc
    model/spectrum-channel.cc
    model/spectrum-converter.cc
    model/spectrum-error-model.cc
    model/spectrum-interference.cc
    model/spectrum-model-300kHz-300GHz-log.cc
    model/spectrum-model-ism2400MHz-res1MHz.cc
    model/spectrum-model.cc
    model/spectrum-phy.cc
    model/spectrum-propagation-loss-model.cc
    model/spectrum-signal-parameters.cc
    model/spectrum-transmit-filter.cc
    model/spectrum-value.cc
    model/three-gpp-channel-model.cc
    model/three-gpp-spectrum-propagation-loss-model.cc
    model/trace-fading-loss-model.cc
    model/tv-spectrum-transmitter.cc
    model/two-ray-spectrum-propagation-loss-model.cc
    model/waveform-generator.cc
    model/wraparound-model.cc
)

set(header_files
    helper/adhoc-aloha-noack-ideal-phy-helper.h
    helper/spectrum-analyzer-helper.h
    helper/spectrum-helper.h
    helper/tv-spectrum-transmitter-helper.h
    helper/waveform-generator-helper.h
    model/aloha-noack-mac-header.h
    model/aloha-noack-net-device.h
    model/constant-spectrum-propagation-loss.h
    model/friis-spectrum-propagation-loss.h
    model/half-duplex-ideal-phy-signal-parameters.h
    model/half-duplex-ideal-phy.h
    model/hexagonal-wraparound-model.h
    model/ism-spectrum-value-helper.h
    model/matrix-based-channel-model.h
    model/microwave-oven-spectrum-value-helper.h
    model/multi-model-spectrum-channel.h
    model/non-communicating-net-device.h
    model/phased-array-spectrum-propagation-loss-model.h
    model/single-model-spectrum-channel.h
    model/spectrum-analyzer.h
    model/spectrum-channel.h
    model/spectrum-converter.h
    model/spectrum-error-model.h
    model/spectrum-interference.h
    model/spectrum-model-300kHz-300GHz-log.h
    model/spectrum-model-ism2400MHz-res1MHz.h
    model/spectrum-model.h
    model/spectrum-phy.h
    model/spectrum-propagation-loss-model.h
    model/spectrum-signal-parameters.h
    model/spectrum-transmit-filter.h
    model/spectrum-value.h
    model/three-gpp-channel-model.h
    model/three-gpp-spectrum-propagation-loss-model.h
    model/trace-fading-loss-model.h
    model/tv-spectrum-transmitter.h
    model/two-ray-spectrum-propagation-loss-model.h
    model/waveform-generator.h
    model/wraparound-model.h
    utils/spectrum-test.h
)

check_deps(
  sionna_deps
  PYTHON_PACKAGES
  cppyy # enables python bindings/dependencies search in venv
  sionna.rt # main sionna package
  pybind11 # required to call sionna from c++
)
set(sionna_test_sources)
if(NOT
   ("${sionna_deps}"
    STREQUAL
    "")
   OR WIN32
)
  message(STATUS "Sionna supports requires extra dependencies: ${sionna_deps}")
else()
  set(sionna_deps
      ${sionna_deps}
      CACHE STRING
            ""
            FORCE
  )
  set(PYBIND11_FINDPYTHON
      ON
  )
  disable_cmake_warnings()
  find_package(
    pybind11
    REQUIRED
  )
  enable_cmake_warnings()
  link_libraries(
    pybind11::headers
    pybind11::embed
    ${CMAKE_DL_LIBS}
  )
  message(
    STATUS "Sionna-RT support enabled: all required dependencies were found."
  )
  find_program(
    NVCC_EXECUTABLE
    nvcc
  )
  if(NOT
     NVCC_EXECUTABLE
  )
    message(
      STATUS
        "Sionna-RT: CUDA toolkit (nvcc) not found. "
        "Dr.Jit will fall back to the CPU/LLVM backend at runtime, "
        "which may result in significantly longer simulation times. "
        "Install the CUDA toolkit and a compatible GPU driver to enable GPU acceleration."
    )
  endif()
  list(
    APPEND
    source_files
    model/sionna-rt-channel-model.cc
    model/sionna-rt-spectrum-propagation-loss-model.cc
  )
  list(
    APPEND
    header_files
    model/sionna-rt-channel-model.h
    model/sionna-rt-spectrum-propagation-loss-model.h
  )
  add_compile_definitions(SIONNA_RT=1)
  set(sionna_test_sources
      test/sionna-channel-model-test.cc
  )

endif()

build_lib(
  LIBNAME spectrum
  SOURCE_FILES ${source_files}
  HEADER_FILES ${header_files}
  LIBRARIES_TO_LINK
    ${libpropagation}
    ${libantenna}
    ${libbuildings}
  TEST_SOURCES
    test/spectrum-ideal-phy-test.cc
    test/spectrum-interference-test.cc
    test/spectrum-value-test.cc
    test/spectrum-waveform-generator-test.cc
    test/three-gpp-channel-test-suite.cc
    test/tv-helper-distribution-test.cc
    test/tv-spectrum-transmitter-test.cc
    test/two-ray-splm-test-suite.cc
    test/wraparound-model-test.cc
    ${sionna_test_sources}
)
