cmake_minimum_required(VERSION 3.6)

set (PROJECT_NAME ImGCS)
project(${PROJECT_NAME})

# Specify at least C++11, better C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


if(UNIX)
    set(CMAKE_THREAD_LIBS_INIT "-lpthread")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
endif (UNIX)

if (MSVC)
    #do something
endif (MSVC)




# Enable strict handling of warnings
# add_definitions("-Wall -Wextra -Werror")
add_definitions(-w)
# add_compile_definitions(_USE_MATH_DEFINES)

# CMakeLists.txt is in root directory.
set (PROJECT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
set (IMGUI_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/libs/imgui)
set (IMGUI_BACKENDS_DIR ${IMGUI_ROOT_DIR}/backends)


############################################################
### GLFW Dependencies

# For apple build
if(APPLE)
    find_package(glfw3 REQUIRED)
endif (APPLE)

# Win32 installed GLFW
if(WIN32)
    set (GLFW_WIN32_PATH ${CMAKE_CURRENT_LIST_DIR}/libs/glfw-3.3.7)
    set (GLFW_WIN32_INCLUDE ${GLFW_WIN32_PATH}/include)
    set (GLFW_WIN32_LIBS ${GLFW_WIN32_PATH}/lib-vc2019)
    include_directories(${GLFW_WIN32_INCLUDE})
endif (WIN32)


############################################################
### IMGUI Dependencies

# define imgui library
file(GLOB IMGUI_SOURCE_FILES ${IMGUI_ROOT_DIR}/*.h ${IMGUI_ROOT_DIR}/*.cpp)

add_library(imgui INTERFACE)
target_link_libraries(imgui INTERFACE ${CMAKE_DL_LIBS})
target_sources(imgui INTERFACE ${IMGUI_SOURCE_FILES})
target_include_directories(imgui INTERFACE ${IMGUI_ROOT_DIR})

# imgui glfw
if (NOT IMGUI_GLFW_TARGET)
    set(IMGUI_GLFW_TARGET glfw)
endif ()

if(WIN32)
    link_directories(${GLFW_WIN32_LIBS})
    set(IMGUI_GLFW_TARGET glfw3)
endif(WIN32)

add_library(imgui-glfw INTERFACE)
target_sources(imgui-glfw INTERFACE
    ${IMGUI_BACKENDS_DIR}/imgui_impl_glfw.h
    ${IMGUI_BACKENDS_DIR}/imgui_impl_glfw.cpp
)
target_link_libraries(imgui-glfw INTERFACE ${CMAKE_DL_LIBS} ${IMGUI_GLFW_TARGET})
target_include_directories(imgui-glfw SYSTEM INTERFACE ${IMGUI_BACKENDS_DIR})

# imgui opengl
set(OpenGL_GL_PREFERENCE "GLVND")   # GLVND is vendor-agnostic OpenGL dispatch library on Linux.
include(FindOpenGL)
if (NOT OPENGL_FOUND)
    message(FATAL_ERROR "IMGUI_IMPL_OPENGL2 or IMGUI_IMPL_OPENGL3 set to ON but OpenGL could not be found.")
endif ()

if (NOT TARGET OpenGL::GL)
    add_library(OpenGL::GL INTERFACE IMPORTED)
    target_include_directories(OpenGL::GL INTERFACE ${OPENGL_INCLUDE_DIR})
    target_link_libraries(OpenGL::GL INTERFACE ${OPENGL_gl_LIBRARY})
endif ()

add_library(imgui-opengl3 INTERFACE)
target_sources(imgui-opengl3 INTERFACE ${IMGUI_BACKENDS_DIR}/imgui_impl_opengl3.cpp)
target_link_libraries (imgui-opengl3 INTERFACE imgui OpenGL::GL)
target_include_directories(imgui-opengl3 SYSTEM INTERFACE ${IMGUI_BACKENDS_DIR})


############################################################
### COPY RESOURCES
configure_file(${CMAKE_CURRENT_LIST_DIR}/assets/fonts/SF-UI-Display-Regular.otf ${CMAKE_BINARY_DIR}/assets/fonts/SF-UI-Display-Regular.otf COPYONLY)
configure_file(${CMAKE_CURRENT_LIST_DIR}/assets/fonts/SF-UI-Display-Regular.ttf ${CMAKE_BINARY_DIR}/assets/fonts/SF-UI-Display-Regular.ttf COPYONLY)
# Material fonts
configure_file(${CMAKE_CURRENT_LIST_DIR}/assets/fonts/MaterialIcons-Regular.ttf ${CMAKE_BINARY_DIR}/assets/fonts/MaterialIcons-Regular.ttf COPYONLY)

#configure_file(${CMAKE_CURRENT_LIST_DIR}/assets/textures/tileload.png ${CMAKE_BINARY_DIR}/assets/textures/tileload.png COPYONLY)


############################################################
### EXTERNAL DEPENDENCIES
include(${PROJECT_ROOT_PATH}/cmake/mavlink.cmake)
include(${PROJECT_ROOT_PATH}/cmake/asio.cmake)
include(${PROJECT_ROOT_PATH}/cmake/httplib.cmake)
include(${PROJECT_ROOT_PATH}/cmake/glew.cmake)
include(${PROJECT_ROOT_PATH}/cmake/iconfonts.cmake)


############################################################
### PROJECT IMPLEMENTATIONS
add_library(gcs-main INTERFACE)
include(${PROJECT_ROOT_PATH}/src/Application/CMakeLists.txt)

add_library(gcs-deps INTERFACE)
include(${PROJECT_ROOT_PATH}/src/Widgets/CMakeLists.txt)
include(${PROJECT_ROOT_PATH}/src/Mavlink/CMakeLists.txt)


#------------------------------------------------------
# ------------------- EXECUTABLE ----------------------
#------------------------------------------------------
add_executable(${PROJECT_NAME} gcs_main.cpp)
target_link_libraries(${PROJECT_NAME} 
    imgui 
    imgui-glfw 
    imgui-opengl3 

    GLEW::GLEW
    
    asio
    httplib
    mavlink
    iconfonts
    
    # Software related implemetations
    gcs-main 
    gcs-deps 

)