cmake_minimum_required(VERSION 3.19)

project(musigloutr++ VERSION 1.0 DESCRIPTION "A discord music bot")

# Options
option(MLPP_STATIC_LIBS "Link libraries statically" OFF)

# Static build
set(MLPP_DPP_TARGET "dpp")
if(MLPP_STATIC_LIBS)
    message("-- musigloutr++: Linking libraries statically")
    set(BUILD_SHARED_LIBS OFF)
    set(AV_ENABLE_SHARED OFF)
    set(AV_ENABLE_STATIC ON)
    set(MLPP_DPP_TARGET "dppstatic")
endif()

# Set library options
set(DPP_INSTALL OFF)
set(DPP_BUILD_TEST OFF)
set(DPP_NO_VCPKG ON)

set(AV_BUILD_EXAMPLES OFF)

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)

# Libraries
include(FetchContent)

FetchContent_Declare(DPP GIT_REPOSITORY "https://github.com/brainboxdotcc/DPP.git"
    GIT_TAG "v10.0.34")
FetchContent_Declare(AvCPP GIT_REPOSITORY "https://github.com/h4tr3d/avcpp.git"
    GIT_TAG "v2.4.0" GIT_SUBMODULES "")
FetchContent_Declare(cpr GIT_REPOSITORY "https://github.com/libcpr/cpr.git"
    GIT_TAG "1.10.5")

FetchContent_MakeAvailable(DPP AvCPP cpr)

# Ensure packages are installed
find_package(SQLite3 REQUIRED)
find_package(Threads REQUIRED)

# Create an executable
add_executable(${PROJECT_NAME}
    src/main.cpp
    src/commands/abstract.cpp
    src/commands/queue.cpp
    src/commands/join.cpp
    src/commands/play.cpp
    src/commands/remove.cpp
    src/commands/leave.cpp
    src/commands/kill.cpp
    src/commands/pause.cpp
    src/commands/jump.cpp
    src/commands/next.cpp
    src/commands/playnext.cpp
    src/commands/move.cpp
    src/commands/resume.cpp
    src/commands/help.cpp
    src/commands/lyrics.cpp
    src/commands/shortcutadd.cpp
    src/commands/shortcutremove.cpp
    src/commands/queue-search-jump.cpp

    src/utils/general.cpp
    src/utils/db.cpp
    src/utils/db-migration.cpp
    src/utils/config.cpp
    src/utils/voice-connection.cpp

    src/entities/abstract.cpp
    src/entities/queue.cpp
    src/entities/queue-item.cpp
    src/entities/search.cpp
    src/entities/shortcut.cpp
)

# Linking libraries
target_link_libraries(${PROJECT_NAME} PRIVATE
    ${MLPP_DPP_TARGET}
    avcpp
    sqlite3
    Threads::Threads
    cpr::cpr
)

# Specify includes
target_include_directories(${PROJECT_NAME} PRIVATE
    ${dpp_SOURCE_DIR}/include
    ${OPUS_INCLUDE_DIRS}/opus
)

# Set C++ version
set_target_properties(${PROJECT_NAME} PROPERTIES
    CXX_STANDARD 20
    CXX_STANDARD_REQUIRED ON
)
