cmake_minimum_required(VERSION 3.18)
project(mediadb_prototype LANGUAGES CXX)

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

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2 -DNDEBUG")

option(CLIENT_ONLY "Build only the client library" OFF)

find_package(libhttppp REQUIRED)
find_package(libnetplus REQUIRED)
find_package(json-c REQUIRED)
find_package(paritypp REQUIRED)

if(NOT CLIENT_ONLY)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(LIBAVFORMAT REQUIRED IMPORTED_TARGET libavformat)
    pkg_check_modules(LIBAVCODEC REQUIRED IMPORTED_TARGET libavcodec)
    pkg_check_modules(LIBAVUTIL REQUIRED IMPORTED_TARGET libavutil)
    pkg_check_modules(LIBSWSCALE REQUIRED IMPORTED_TARGET libswscale)

    find_package(libuuidp REQUIRED)
    find_package(authdb REQUIRED)
    find_package(libconfplus REQUIRED)
    find_package(libcmdplus REQUIRED)
endif()

add_library(mediadb_client STATIC
    src/client.cpp
)

target_include_directories(mediadb_client PUBLIC
    include
    /usr/local/include/netplus
)

if(NOT MSVC)
    target_compile_options(mediadb_client PUBLIC "-fPIC")
endif()

target_link_libraries(mediadb_client PUBLIC
    httppp
    netplus
    json-c::json-c
    paritypp::paritypp
)

if(NOT CLIENT_ONLY)
    add_executable(mediadb
        src/main.cpp
        src/cluster.cpp
        src/backend.cpp
        src/auth.cpp
        src/preview.cpp
        src/app.cpp
        src/server.cpp
    )

    target_include_directories(mediadb PRIVATE
        include
    )

    target_link_libraries(mediadb PRIVATE
        PkgConfig::LIBAVFORMAT
        PkgConfig::LIBAVCODEC
        PkgConfig::LIBAVUTIL
        PkgConfig::LIBSWSCALE
        json-c::json-c
        httppp
        netplus
        uuidp::uuidp
        authdb::client
        paritypp::paritypp
        confplus
        cmdplus
    )

    target_include_directories(mediadb PRIVATE /usr/local/include/netplus)

    add_executable(mds_convert src/mds_convert.cpp)
    target_compile_features(mds_convert PRIVATE cxx_std_20)

    add_executable(mde_check utils/mde_check.cpp)
    target_compile_features(mde_check PRIVATE cxx_std_20)

    add_executable(mde_extract utils/mde_extract.cpp)
    target_compile_features(mde_extract PRIVATE cxx_std_20)

    add_executable(mediadb_test
        test/mediadb_test.cpp
        src/backend.cpp
        src/cluster.cpp
    )

    target_include_directories(mediadb_test PRIVATE
        include
        /usr/local/include/netplus
    )

    target_link_libraries(mediadb_test PRIVATE
        json-c::json-c
        httppp
        netplus
        uuidp::uuidp
        paritypp::paritypp
        authdb::client
    )

    add_executable(mediadb_perf_test
        test/mediadb_perf_test.cpp
        src/backend.cpp
        src/cluster.cpp
    )

    target_include_directories(mediadb_perf_test PRIVATE
        include
        /usr/local/include/netplus
    )

    target_link_libraries(mediadb_perf_test PRIVATE
        json-c::json-c
        httppp
        netplus
        uuidp::uuidp
        paritypp::paritypp
        authdb::client
    )

    add_executable(mediadb_cluster_perf_test
        test/mediadb_cluster_perf_test.cpp
        src/backend.cpp
        src/cluster.cpp
        src/preview.cpp
    )

    target_include_directories(mediadb_cluster_perf_test PRIVATE
        include
        /usr/local/include/netplus
    )

    target_link_libraries(mediadb_cluster_perf_test PRIVATE
        PkgConfig::LIBAVFORMAT
        PkgConfig::LIBAVCODEC
        PkgConfig::LIBAVUTIL
        PkgConfig::LIBSWSCALE
        json-c::json-c
        httppp
        netplus
        uuidp::uuidp
        paritypp::paritypp
        authdb::client
    )

    add_executable(mediadb_cache_test
        test/mediadb_cache_test.cpp
        src/preview.cpp
    )

    target_include_directories(mediadb_cache_test PRIVATE
        include
        /usr/local/include/netplus
    )

    target_link_libraries(mediadb_cache_test PRIVATE
        PkgConfig::LIBAVFORMAT
        PkgConfig::LIBAVCODEC
        PkgConfig::LIBAVUTIL
        PkgConfig::LIBSWSCALE
        json-c::json-c
        httppp
        netplus
        uuidp::uuidp
        paritypp::paritypp
        authdb::client
    )
endif()

include(GNUInstallDirs)

if(NOT CLIENT_ONLY)
    install(TARGETS mediadb DESTINATION ${CMAKE_INSTALL_BINDIR})
    install(TARGETS mds_convert DESTINATION ${CMAKE_INSTALL_BINDIR})
    install(DIRECTORY html/ DESTINATION ${CMAKE_INSTALL_DATADIR}/mediadb/html)
    install(DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/mediadb)
    install(DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/mediadb/uploads)
    install(DIRECTORY DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/mediadb)
endif()

install(TARGETS mediadb_client DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY include/mediadb DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
