cmake_minimum_required(VERSION 3.10)

project(sparkle)

include(GoogleTest)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(SOURCE sources/main.cpp)
set(LIBS ${CMAKE_SOURCE_DIR}/libs/)
set(INCLUDE ${CMAKE_SOURCE_DIR}/include/)
set(TESTS ${CMAKE_SOURCE_DIR}/tests)
set(ADDITIONAL_CXX_FLAGS_DEBUG "-pipe -Wall -Wextra -O0 -fsanitize=address")
set(ADDITIONAL_CXX_FLAGS_RELEASE "-march=native -pipe -Wall -Wextra -O2 -flto")

find_package(CURL REQUIRED)
find_path(IXWEBSOCKET_INCLUDE_DIR ixwebsocket)
find_library(IXWEBSOCKET_LIBRARIES ixwebsocket)

message(STATUS "Current compiler: ${CMAKE_CXX_COMPILER}")

if(NOT IXWEBSOCKET_INCLUDE_DIR OR NOT IXWEBSOCKET_LIBRARIES)
    message(FATAL_ERROR "ixwebsocket not found")
endif()

if(NOT CURL_INCLUDE_DIRS OR NOT CURL_LIBRARIES)
    message(FATAL_ERROR "curl not found")
endif()

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
endif()

if(CMAKE_BUILD_TYPE)
    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        set(CMAKE_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS_DEBUG}")
        add_definitions(-DDEBUG)
    elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
        add_definitions(-DRELEASE)
        set(CMAKE_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS_RELEASE}")
    endif()
endif()

message(STATUS "${CMAKE_BUILD_TYPE}")

add_executable(${PROJECT_NAME} ${SOURCE})
#add_library(sparkles STATIC ${SOURCE})
add_executable(tests ${TESTS}/tests.cpp)

enable_testing()

add_test(NAME NetworkManagerTest COMMAND tests)

target_include_directories(${PROJECT_NAME} PRIVATE
    ${LIBS}
    ${INCLUDE}
    ${IXWEBSOCKET_INCLUDE_DIR}
    ${CURL_INCLUDE_DIRS}
)

target_link_libraries(${PROJECT_NAME} PRIVATE
    ${IXWEBSOCKET_LIBRARIES}
    ${CURL_LIBRARIES}
)

target_include_directories(tests PRIVATE
    ${LIBS}
    ${INCLUDE}
    ${IXWEBSOCKET_INCLUDE_DIR}
    ${CURL_INCLUDE_DIRS}
)

target_link_libraries(tests gtest
    ${IXWEBSOCKET_LIBRARIES}
    ${CURL_LIBRARIES}
    gtest_main
)