include (ACGCommon)

acg_get_version ()

# Disable Library installation when not building ACG on its own but as part of another project!
if ( ${PROJECT_NAME} MATCHES "OpenFlipper")
  set(ACG_NO_LIBRARY_INSTALL true)
endif()


acg_qt5 ()  

if (NOT QT5_FOUND)
  message(FATAL ERROR "Qt5 not found")
endif ()

acg_openmp ()

# check for OpenGL, GLEW as our required dependencies
find_package (OpenGL)
if (NOT OPENGL_FOUND)
  message (FATAL_ERROR "OpengGL not found!")
endif ()

find_package (OpenMesh)
if (NOT OPENMESH_FOUND)
    message (FATAL_ERROR "OpenMesh not found!")
endif ()

set(INCLUDE_DIRS ${OPENMESH_INCLUDE_DIRS}
                 ${CMAKE_CURRENT_SOURCE_DIR}
                 ${CMAKE_CURRENT_SOURCE_DIR}/ShaderUtils
                 ${CMAKE_CURRENT_BINARY_DIR}
                 ${OPENGL_INCLUDE_DIR} )

set(ADDITIONAL_LINK_LIBRARIES "" )
set(ADDITIONAL_BUILD_DIRS "" )

find_package (QJson)
if (QJSON_FOUND)
    LIST(APPEND INCLUDE_DIRS ${QJSON_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LINK_LIBRARIES ${QJSON_LIBRARY})
endif ()

# use Qwt6 for QT5
if (QT5_FOUND)
  find_package(Qwt6)

  if (QWT6_FOUND)
    set(INCLUDE_DIRS ${INCLUDE_DIRS} ${QWT6_INCLUDE_DIRS} )
    set(ADDITIONAL_LINK_LIBRARIES ${ADDITIONAL_LINK_LIBRARIES} ${QWT6_LIBRARIES})
    set(ADDITIONAL_BUILD_DIRS "QwtWidgets" )
  endif()

endif()

include_directories (
  ..
  ${INCLUDE_DIRS}
  ../glew-cmake/include
)

#===================================================================
# ACG Library setup
#===================================================================

# source code directories
set (directories
  .
  Geometry
  Config
  Geometry/Types
  Geometry/bsp
  GL
  IO
  Math
  QtWidgets
  Scenegraph
  QtScenegraph
  ShaderUtils
  Utils
  ${ADDITIONAL_BUILD_DIRS}
)

# generate dllexport macros on windows
if (WIN32)
  add_definitions(-DACGDLL )
  remove_definitions(-DUSEACG)
endif ()

# collect all header,source and ui files
acg_append_files (headers  "*.hh" ${directories})
acg_append_files (sources  "*.cc" ${directories})
acg_append_files (ui-files "*.ui" ${directories})
acg_append_files (qrc      "*.qrc" ${directories} .)

source_group(TREE ${CMAKE_SOURCE_DIR} FILES ${sources} ${headers} ${ui-files} ${qrc}) 

if (QT5_FOUND)
  acg_add_library (ACG SHARED ${sources} ${headers} ${qrc})
endif()

if ( NOT WIN32 )
  set_target_properties (ACG PROPERTIES VERSION ${ACG_VERSION_MAJOR}.${ACG_VERSION_MINOR}
                                      SOVERSION ${ACG_VERSION_MAJOR}.${ACG_VERSION_MINOR})
endif()

if (NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE)
  install (TARGETS ACG DESTINATION ${ACG_PROJECT_LIBDIR})
endif ()

# display results
acg_print_configure_header (ACG "ACG")

if ( NOT WIN32 )
  # Allow targets depending on ACG find the autogenerated header files
  target_include_directories( ACG PUBLIC
                               ${CMAKE_CURRENT_BINARY_DIR}/ACG_autogen/include )
else()
   # Allow targets depending on ACG find the autogenerated header files
  target_include_directories( ACG PUBLIC
                               $<$<CONFIG:Debug>:${CMAKE_CURRENT_BINARY_DIR}/ACG_autogen/include_Debug/>
                               $<$<CONFIG:Release>:${CMAKE_CURRENT_BINARY_DIR}/ACG_autogen/include_Release/> )
endif()

target_link_libraries ( ACG  ${OPENMESH_LIBRARIES}
                             ${QT_LIBRARIES}
                             ${OPENGL_LIBRARIES}
                             ${ADDITIONAL_LINK_LIBRARIES}
                             libglew_shared )


#===================================================================
# Setting up the unit tests
#===================================================================
find_package(GoogleTest)
if (GTEST_FOUND)


  if ( NOT DEFINED ACG_BUILD_UNIT_TESTS )
    set( ACG_BUILD_UNIT_TESTS false CACHE BOOL "Enable or disable unit tests on ACG library." )
  endif()

  if ( ACG_BUILD_UNIT_TESTS )

    enable_testing()

    file(GLOB_RECURSE TEST_SOURCES tests/*.cc)
    set(TESTED_SOURCES
          Algorithm/DBSCANT_impl.hh
       )
    include_directories(${GTEST_INCLUDE_DIRS} ${OPENMESH_INCLUDE_DIR})
    link_directories ( ${GTEST_LIBRARY_DIR})

    if ( CMAKE_GENERATOR MATCHES "^Visual Studio 11.*" )
       add_definitions( /D _VARIADIC_MAX=10 )
    endif()
 
    add_executable (ACG_tests ${TEST_SOURCES})

    set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
    # run tests in build directory of OF
    if ( ${PROJECT_NAME} MATCHES "OpenFlipper" AND WIN32)
      set(OUT_DIR  ${CMAKE_BINARY_DIR}/Build)
    endif()

    set_target_properties(ACG_tests PROPERTIES
      COMPILE_FLAGS "-UNDEBUG"
      RUNTIME_OUTPUT_DIRECTORY ${OUT_DIR}
      RUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_DIR}
      RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_DIR}
    )
  
    target_link_libraries(ACG_tests
          ${GTEST_LIBRARIES} ${OPENMESH_LIBRARIES} ACG
    )
  
    add_test(NAME AllTestsIn_ACG_tests COMMAND ${OUT_DIR}/ACG_tests)

  endif( ACG_BUILD_UNIT_TESTS )

endif(GTEST_FOUND)
