set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_OUTPUT_DIRECTORY}/apps)
if(WIN32)
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
endif()

if(APPLE)
  set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
  if(NOT BUILD_MAC_APP_BUNDLE)
    set(CMAKE_MACOSX_RPATH TRUE)
  endif()
else()
  set(CMAKE_INSTALL_RPATH "\${ORIGIN}/../lib")
endif()
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

option(BUILD_MNE_SCAN "Build MNE Scan" ON)
option(BUILD_MNE_ANALYZE "Build MNE Analyze" ON)
option(BUILD_MNE_ANONYMIZE "Build MNE Anonymize" ON)
option(BUILD_MNE_RT_SERVER "Build MNE Rt Server" ON)
option(BUILD_MNE_FORWARD_SOLUTION "Build MNE Forward Solution" ON)
option(BUILD_MNE_EDF2FIFF "Build MNE edf to fiff" ON)
option(BUILD_MNE_DIPOLE_FIT "Build MNE Dipole Fit" ON)
option(BUILD_MNE_BROWSE "Build MNE Browse" ON)
option(BUILD_MNE_INSPECT "Build MNE Inspect" ON)
option(BUILD_MNE_SHOW_FIFF "Build MNE Show Fiff" ON)
option(BUILD_MNE_COMPUTE_RAW_INVERSE "Build MNE Compute Raw Inverse" ON)
option(BUILD_MNE_SETUP_MRI "Build MNE Setup MRI" ON)
option(BUILD_MNE_SURF2BEM "Build MNE Surf2Bem" ON)
option(BUILD_MNE_SETUP_FORWARD_MODEL "Build MNE Setup Forward Model" ON)
option(BUILD_MNE_PROCESS_RAW "Build MNE Process Raw" ON)
option(BUILD_MNE_INVERSE_OPERATOR "Build MNE Inverse Operator" ON)
option(BUILD_MNE_COMPUTE_MNE "Build MNE Compute MNE" ON)
option(BUILD_MNE_MAKE_SOURCE_SPACE "Build MNE Make Source Space" ON)

# FreeSurfer detection — mne_watershed_bem and mne_flash_bem call FreeSurfer
# programs (mri_watershed, mri_convert, etc.) via QProcess at runtime.
# Only build these applications when FreeSurfer is available.
set(FREESURFER_FOUND FALSE)
if(DEFINED ENV{FREESURFER_HOME} AND EXISTS "$ENV{FREESURFER_HOME}/bin/mri_watershed")
  set(FREESURFER_FOUND TRUE)
  message(STATUS "FreeSurfer found at $ENV{FREESURFER_HOME}")
else()
  find_program(MRI_WATERSHED_BIN mri_watershed)
  if(MRI_WATERSHED_BIN)
    set(FREESURFER_FOUND TRUE)
    message(STATUS "FreeSurfer mri_watershed found at ${MRI_WATERSHED_BIN}")
  else()
    message(STATUS "FreeSurfer not found — skipping mne_watershed_bem and mne_flash_bem")
  endif()
endif()

option(BUILD_MNE_WATERSHED_BEM "Build MNE Watershed BEM (requires FreeSurfer)" ${FREESURFER_FOUND})
option(BUILD_MNE_FLASH_BEM "Build MNE Flash BEM (requires FreeSurfer)" ${FREESURFER_FOUND})

option(APPS_REALTIME "Build only realtime apps" OFF)
if(APPS_REALTIME)
  set(BUILD_MNE_SCAN ON)
  set(BUILD_MNE_ANALYZE OFF)
  set(BUILD_MNE_ANONYMIZE OFF)
  set(BUILD_MNE_RT_SERVER ON)
  set(BUILD_MNE_FORWARD_SOLUTION OFF)
  set(BUILD_MNE_EDF2FIFF OFF)
  set(BUILD_MNE_DIPOLE_FIT OFF)
endif()

option(APPS_OFFLINE "Build only offline apps" OFF)
if(APPS_OFFLINE)
  set(BUILD_MNE_SCAN OFF)
  set(BUILD_MNE_ANALYZE ON)
  set(BUILD_MNE_ANONYMIZE ON)
  set(BUILD_MNE_RT_SERVER OFF)
  set(BUILD_MNE_FORWARD_SOLUTION ON)
  set(BUILD_MNE_EDF2FIFF ON)

  set(BUILD_MNE_DIPOLE_FIT ON)
  set(BUILD_MNE_BROWSE ON)
  set(BUILD_MNE_INSPECT ON)
  set(BUILD_MNE_SHOW_FIFF ON)
  set(BUILD_MNE_COMPUTE_RAW_INVERSE ON)
  if(FREESURFER_FOUND)
    set(BUILD_MNE_WATERSHED_BEM ON)
    set(BUILD_MNE_FLASH_BEM ON)
  endif()
  set(BUILD_MNE_SURF2BEM ON)
  set(BUILD_MNE_SETUP_FORWARD_MODEL ON)
  set(BUILD_MNE_PROCESS_RAW ON)
  set(BUILD_MNE_INVERSE_OPERATOR ON)
  set(BUILD_MNE_COMPUTE_MNE ON)
  set(BUILD_MNE_MAKE_SOURCE_SPACE ON)
endif()

if(BUILD_MNE_ANONYMIZE)
  add_subdirectory(mne_anonymize)
endif()
  if(BUILD_MNE_ANALYZE)
    add_subdirectory(mne_analyze)
  endif()
  if(BUILD_MNE_INSPECT AND TARGET mne_disp3D_rhi)
    add_subdirectory(mne_inspect)
  endif()
  if(BUILD_MNE_BROWSE)
    add_subdirectory(mne_browse)
  endif()
if(NOT WASM)
  if(BUILD_MNE_SCAN)
    add_subdirectory(mne_scan)
  endif()
  if(BUILD_MNE_RT_SERVER)
    add_subdirectory(mne_rt_server)
  endif()
  if(BUILD_MNE_FORWARD_SOLUTION)
    add_subdirectory(mne_forward_solution)
  endif()
  if(BUILD_MNE_EDF2FIFF)
    add_subdirectory(mne_edf2fiff)
  endif()
  if(BUILD_MNE_DIPOLE_FIT)
    add_subdirectory(mne_dipole_fit)
  endif()
  if(BUILD_MNE_SHOW_FIFF)
    add_subdirectory(mne_show_fiff)
  endif()
  if(BUILD_MNE_COMPUTE_RAW_INVERSE)
    add_subdirectory(mne_compute_raw_inverse)
  endif()
  if(BUILD_MNE_SETUP_MRI)
    add_subdirectory(mne_setup_mri)
  endif()
  if(BUILD_MNE_WATERSHED_BEM)
    add_subdirectory(mne_watershed_bem)
  endif()
  if(BUILD_MNE_SURF2BEM)
    add_subdirectory(mne_surf2bem)
  endif()
  if(BUILD_MNE_FLASH_BEM)
    add_subdirectory(mne_flash_bem)
  endif()
  if(BUILD_MNE_SETUP_FORWARD_MODEL)
    add_subdirectory(mne_setup_forward_model)
  endif()
  if(BUILD_MNE_PROCESS_RAW)
    add_subdirectory(mne_process_raw)
  endif()
  if(BUILD_MNE_INVERSE_OPERATOR)
    add_subdirectory(mne_inverse_operator)
  endif()
  if(BUILD_MNE_COMPUTE_MNE)
    add_subdirectory(mne_compute_mne)
  endif()
  if(BUILD_MNE_MAKE_SOURCE_SPACE)
    add_subdirectory(mne_make_source_space)
  endif()
endif()
