cmake_minimum_required(VERSION 3.5)

project(QBrainwaveOSC VERSION 0.1 LANGUAGES CXX C)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
include_directories(
   ${PROJECT_SOURCE_DIR}/thirdparty/include
   ${PROJECT_SOURCE_DIR}/src
   ${PROJECT_SOURCE_DIR}/src/QBrainwaveInterface
   ${PROJECT_SOURCE_DIR}/src/QBrainwaveInterface/DataParsers
   ${PROJECT_SOURCE_DIR}/src/QBrainwaveInterface/WaveAnalyser
   ${PROJECT_SOURCE_DIR}/src/OSCSender
   ${PROJECT_SOURCE_DIR}/src/GUI
   ${PROJECT_SOURCE_DIR}/src/GUI/SettingsWidget
   ${PROJECT_SOURCE_DIR}/src/GUI/SettingsWidget/DeviceSettings
   ${PROJECT_SOURCE_DIR}/src/GUI/MonitorWidget
   ${PROJECT_SOURCE_DIR}/src/GUI/GraphsWidget
)

set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out/lib/archive)
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out/lib)
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out/bin)

option(FORCE_QT5 "Force qt5 install" OFF)
option(FORCE_QT6 "Force qt6 install" OFF)

option(USE_FFTW "Use FFTW" ON)

if(USE_FFTW)
message("Using fftw3")
#    if(USE_FFTW STREQUAL "legacy")
        find_package(FFTW3 REQUIRED)
#    else()
#        find_package(FFTW3 REQUIRED CONFIG)
#    endif()
add_compile_definitions(USE_FFTW)
message("FFTW3_LIBRARIES: ${FFTW3_LIBRARIES}")
message("FFTW3_LIBRARY: ${FFTW3_LIBRARY}")
message("FFTW3_INCLUDE_DIRS: ${FFTW3_INCLUDE_DIRS}")
#include_directories(${FFTW3_INCLUDE_DIRS})
else()
message("Using kissfft")
add_compile_definitions(USE_KISSFFT)
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/kissfft)
endif()

if ($ENV{QT_VERSION_MAJOR})
  set(QT_VERSION_MAJOR $ENV{QT_VERSION_MAJOR})
else()
  find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Widgets SerialPort Charts Network)
endif()
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets SerialPort Charts Network)
add_compile_definitions(QT${QT_VERSION_MAJOR})

if(WIN32)
add_compile_definitions(_USE_MATH_DEFINES)
endif()

add_subdirectory(src)
# set icon
if(APPLE)
    set(APP_ICON_MACOSX "${CMAKE_CURRENT_SOURCE_DIR}/desktop/AppIcon.icns")
    set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES
           MACOSX_PACKAGE_LOCATION "Resources")
    set(RESOURCES ${RESOURCES} ${APP_ICON_MACOSX})
elseif(WIN32)
    enable_language("RC")
    set(APP_ICON_RESOURCE_WINDOWS "${CMAKE_CURRENT_SOURCE_DIR}/desktop/AppIcon.rc")
    set(RESOURCES ${RESOURCES} ${APP_ICON_RESOURCE_WINDOWS})
endif()

set(PROJECT_SOURCES
        ${RESOURCES}
        ${PROJECT_SOURCES}
    )


if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(${PROJECT_NAME}
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(${PROJECT_NAME} SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(${PROJECT_NAME}
            ${PROJECT_SOURCES}
        )
    endif()
endif()

IF(WIN32)
    set_property(TARGET ${PROJECT_NAME} PROPERTY WIN32_EXECUTABLE true)
ELSEIF(APPLE)
    set_property(TARGET ${PROJECT_NAME} PROPERTY MACOSX_BUNDLE true)
    set_target_properties(${PROJECT_NAME} PROPERTIES
    BUNDLE True
    MACOSX_BUNDLE_GUI_IDENTIFIER org.donarturo11.${PROJECT_NAME}.com
    MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}
    MACOSX_BUNDLE_BUNDLE_VERSION "0.1"
    MACOSX_BUNDLE_SHORT_VERSION_STRING "0.1"
    MACOSX_BUNDLE_ICON_FILE AppIcon.icns
    INSTALL_RPATH @executable_path/../Frameworks
    )
ENDIF()


if(USE_FFTW)
  target_link_libraries(${PROJECT_NAME} PRIVATE FFTW3::fftw3)
endif()

target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::SerialPort)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Charts)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Network)

## deploy
if(APPLE)
  set(APP "$<TARGET_BUNDLE_DIR:${PROJECT_NAME}>")
elseif(WIN32)
  set(APP "$<TARGET_FILE:${PROJECT_NAME}>")
endif()
add_custom_target(deploy)
add_custom_command(TARGET deploy POST_BUILD
    COMMAND ${CMAKE_COMMAND}
        -DAPP="${APP}"
        -DSEARCH_DIRS="${CMAKE_LINK_DIRECTORIES}"
        -P "${CMAKE_SOURCE_DIR}/cmake/deploy.cmake"
)


### install ##
if(WIN32)
    message("Installing for Windows")
    include(GNUInstallDirs)
    set(CMAKE_INSTALL_BINDIR .)
    install(FILES desktop/AppIcon.ico DESTINATION ${CMAKE_INSTALL_BINDIR})
elseif(UNIX AND (NOT APPLE))
    message("Installing for UNIX")
    include(GNUInstallDirs)
    install(FILES desktop/AppIcon.png RENAME ${PROJECT_NAME}.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128/apps)
    install(FILES desktop/${PROJECT_NAME}.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
elseif(APPLE)
    message("Installing for macOS")
    install(FILES desktop/AppIcon.icns DESTINATION ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app/Contents/Resources)
endif()

install(TARGETS ${PROJECT_NAME}
    BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

message(STATUS CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH})
include(CPackConfig)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(${PROJECT_NAME})
endif()
