cmake_minimum_required(VERSION 3.20)

project(visione-backend VERSION 0.1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

find_package(Python3 COMPONENTS Interpreter REQUIRED)

option(USE_SYSTEM_DROGON "Use an installed Drogon package instead of CPM" OFF)

if (USE_SYSTEM_DROGON)
    find_package(Drogon CONFIG REQUIRED)
else ()
    set(CPM_SOURCE_CACHE "${CMAKE_CURRENT_SOURCE_DIR}/.cache/cpm" CACHE PATH "CPM dependency cache")
    include(cmake/CPM.cmake)

    CPMAddPackage(
        NAME Drogon
        GITHUB_REPOSITORY drogonframework/drogon
        GIT_TAG v1.9.13
        OPTIONS
            "BUILD_CTL OFF"
            "BUILD_EXAMPLES OFF"
            "BUILD_ORM ON"
            "BUILD_MYSQL ON"
            "BUILD_POSTGRESQL OFF"
            "BUILD_REDIS OFF"
            "BUILD_SQLITE OFF"
            "BUILD_BROTLI OFF"
            "BUILD_YAML_CONFIG OFF"
            "BUILD_TESTING OFF"
    )
endif ()

set(APP_SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/controllers/ApiController.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/controllers/AdminController.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/controllers/AuthController.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/controllers/ReportController.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/common/Auth.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/common/Cors.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/common/Crypto.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/common/Email.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/common/GeoJson.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/common/Http.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/common/Validation.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/plugins/RequestLogger.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/repositories/MigrationRunner.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/repositories/Sql.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/services/AdminService.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/services/AuthService.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/services/ReportService.cc
)

add_executable(${PROJECT_NAME}
    main.cc
    ${APP_SOURCES}
)

target_include_directories(${PROJECT_NAME}
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
)

target_link_libraries(${PROJECT_NAME}
    PRIVATE
        Drogon::Drogon
)

file(GLOB CONTROLLER_HEADERS CONFIGURE_DEPENDS
    ${CMAKE_CURRENT_SOURCE_DIR}/controllers/*.h
)
set(OPENAPI_OUTPUT ${CMAKE_BINARY_DIR}/openapi/visione.openapi.json)
add_custom_command(
    OUTPUT ${OPENAPI_OUTPUT}
    COMMAND ${Python3_EXECUTABLE}
            ${CMAKE_CURRENT_SOURCE_DIR}/tools/drogon-openapi-gen/generate.py
            --controllers ${CMAKE_CURRENT_SOURCE_DIR}/controllers
            --out ${OPENAPI_OUTPUT}
            --title "Visione API"
            --version ${PROJECT_VERSION}
    DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/tools/drogon-openapi-gen/generate.py
        ${CONTROLLER_HEADERS}
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    VERBATIM
)
add_custom_target(openapi ALL DEPENDS ${OPENAPI_OUTPUT})
add_dependencies(${PROJECT_NAME} openapi)

enable_testing()
add_subdirectory(test)
