cmake_minimum_required(VERSION 3.20)
project(simulation LANGUAGES CXX)

find_package(TBB REQUIRED)
if (LINUX)
  find_package(Boost REQUIRED)
elseif (WIN32)
  find_package(Boost REQUIRED COMPONENTS process)
endif()

list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include(libigl)
igl_include(copyleft tetgen)

add_executable(simulation
        src/main.cpp
        src/simulation.cpp
        src/sim_arg_parser.cpp
        src/test_sim.cpp
        include/test_sim.h
        src/ffmpeg_frame_encoder.cpp
        include/ffmpeg_frame_encoder.h
        src/frame_encoder.cpp
        src/frame_encoder.h
        src/vbd_sim.cpp
        include/vbd_sim.h
        src/collisions.cpp
        src/tetmesh.cpp
        src/trimesh.cpp
        src/Button.cpp
        include/Button.h
        include/button_press_listener.h
        src/dice_thrower.cpp
        include/dice_thrower.h
        src/orbital_camera.cpp
        include/camera.h
        include/orbital_camera.h
        src/orbital_camera.cpp
)

set(LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib")
set(INCLUDE_DIR
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
        "${CMAKE_CURRENT_SOURCE_DIR}/include/raylib"
)
if (LINUX)
    set(RAYLIB_LIBS
            "${LIB_DIR}/libraylib.a"
            "${LIB_DIR}/libraylib.so"
            "${LIB_DIR}/libraylib.so.6.0.0"
            "${LIB_DIR}/libraylib.so.600"
    )
elseif (WIN32)
    set(RAYLIB_LIBS
            "${LIB_DIR}/raylib.lib"
            "${LIB_DIR}/raylibdll.lib"
    )
endif()

include(FetchContent)
FetchContent_Declare(
        argparse
        GIT_REPOSITORY https://github.com/p-ranav/argparse.git
)
FetchContent_MakeAvailable(argparse)

if (LINUX)
    set(PLATFORM_DEP_LIBS
            X11
    )
elseif (WIN32)
    set(PLATFORM_DEP_LIBS
            winmm.lib
            Boost::process
    )
endif ()

if (WIN32)
    # Find ffmpeg on windows using vpckg
    find_program(FFMPEG_EXECUTABLE ffmpeg)
    if(FFMPEG_EXECUTABLE)
        target_compile_definitions(simulation PRIVATE FFMPEG_BIN="${FFMPEG_EXECUTABLE}")
    else()
        message(FATAL_ERROR "ffmpeg executable not found!")
    endif()
endif ()

target_include_directories(simulation PRIVATE
        ${INCLUDE_DIR}
        ${Boost_INCLUDE_DIRS}
)
target_link_directories(simulation PRIVATE ${LIB_DIR})
target_link_libraries(simulation PRIVATE
        ${RAYLIB_LIBS}
        ${PLATFORM_DEP_LIBS}
        argparse
        TBB::tbb
)
target_link_libraries(simulation PUBLIC 
  igl_copyleft::tetgen
 )

if(LINUX)
    target_compile_definitions(simulation PRIVATE __LINUX__)
elseif(WIN32)
    target_compile_definitions(simulation PRIVATE __WIN__)
    # Disable some conflicting windows headers
    target_compile_definitions(simulation PRIVATE WIN32_LEAN_AND_MEAN)
endif()
