#
# Copyright (C) 2025 Eyeware Tech SA.
#
cmake_minimum_required(VERSION 3.15)
project(beam_cpp_samples)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Hard-code here where you unzipped the Beam Eye Tracker SDK (folder containing include/ and lib/).
set(BEAM_EYE_TRACKER_SDK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../.." CACHE PATH "Path to beam_eye_tracker_client installation")

if(WIN32)
    set(BEAM_PLATFORM "win64")
elseif(APPLE)
    set(BEAM_PLATFORM "macos")
elseif(UNIX)
    set(BEAM_PLATFORM "linux64")
else()
    message(FATAL_ERROR "Unsupported platform for Beam C++ samples")
endif()

# Verify the required directories exist
if(NOT EXISTS "${BEAM_EYE_TRACKER_SDK_DIR}")
    message(FATAL_ERROR "beam_eye_tracker_client directory not found at ${BEAM_EYE_TRACKER_SDK_DIR}")
endif()

######################### BEAM EYE TRACKER LIBRARY #########################
add_library(beam_eye_tracker_client INTERFACE)
target_include_directories(beam_eye_tracker_client
    INTERFACE
        ${BEAM_EYE_TRACKER_SDK_DIR}/include
)

if(WIN32)
    set(BEAM_CLIENT_DLL "${BEAM_EYE_TRACKER_SDK_DIR}/bin/${BEAM_PLATFORM}/beam_eye_tracker_client.dll")
    set(BEAM_CLIENT_IMPORT_LIB "${BEAM_EYE_TRACKER_SDK_DIR}/lib/${BEAM_PLATFORM}/beam_eye_tracker_client.lib")
    set_target_properties(beam_eye_tracker_client PROPERTIES
        INTERFACE_DLL_LOCATION "${BEAM_CLIENT_DLL}"
    )
    target_link_libraries(beam_eye_tracker_client
        INTERFACE
            "${BEAM_CLIENT_IMPORT_LIB}"
    )
    get_target_property(DLL_LOCATION beam_eye_tracker_client INTERFACE_DLL_LOCATION)
    install(FILES "${DLL_LOCATION}" DESTINATION ./${BEAM_PLATFORM})
else()
    set(BEAM_CLIENT_SHARED_LIB "${BEAM_EYE_TRACKER_SDK_DIR}/lib/${BEAM_PLATFORM}/libbeam_eye_tracker_client${CMAKE_SHARED_LIBRARY_SUFFIX}")
    target_link_libraries(beam_eye_tracker_client
        INTERFACE
            "${BEAM_CLIENT_SHARED_LIB}"
    )
endif()

# Non-macOS Unix: add_beam_sample links Threads::Threads (harmless for samples that do not use std::thread).
if(UNIX AND NOT APPLE)
    find_package(Threads REQUIRED)
endif()

function(add_beam_sample TARGET_NAME SAMPLE_SOURCE_FILES)
    add_executable(${TARGET_NAME} ${SAMPLE_SOURCE_FILES})
    target_link_libraries(${TARGET_NAME} PRIVATE beam_eye_tracker_client)
    if (APPLE)
        target_link_libraries(${TARGET_NAME} PRIVATE
            "-framework ApplicationServices"
            "-framework Carbon"
        )
        set_target_properties(${TARGET_NAME} PROPERTIES
            # macOS uses @loader_path (No backslash needed)
            BUILD_RPATH "${BEAM_EYE_TRACKER_SDK_DIR}/lib/${BEAM_PLATFORM}"
            INSTALL_RPATH "@loader_path/../../../../lib/${BEAM_PLATFORM}"
        )
    elseif(UNIX)
        target_link_libraries(${TARGET_NAME} PRIVATE Threads::Threads)
        set_target_properties(${TARGET_NAME} PROPERTIES
            # Linux uses $ORIGIN (Needs the backslash)
            BUILD_RPATH "${BEAM_EYE_TRACKER_SDK_DIR}/lib/${BEAM_PLATFORM}"
            INSTALL_RPATH "\$ORIGIN/../../../../lib/${BEAM_PLATFORM}"
        )
    endif()
    install(TARGETS ${TARGET_NAME} DESTINATION ./${BEAM_PLATFORM})
endfunction()

################ GAME ENGINE INTEGRATION SAMPLE #################
add_beam_sample(game_engine_integration
    game_engine_integration/main.cpp
    game_engine_integration/bet_game_engine_device.h
    game_engine_integration/my_game_engine.h
)

################ DATA ACCESS METHODS SAMPLES #################
add_beam_sample(sync_data_access
    data_access_methods/bet_sync_data_access.cpp
)
add_beam_sample(polling_data_access
    data_access_methods/bet_polling_data_access.cpp
)
add_beam_sample(async_data_access
    data_access_methods/bet_async_data_access.cpp
)

################ AUTO START BEAM SAMPLE #################
add_beam_sample(auto_start_beam bet_auto_start_beam.cpp)

