cmake_minimum_required(VERSION 3.22)
project(SubWave LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia OpenGL OpenGLWidgets)

# require ffmpeg
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET
    libavformat
    libavcodec
    libavutil
    libswresample
)
# require fftw (fourier transform)
pkg_check_modules(FFTW REQUIRED IMPORTED_TARGET fftw3)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

# source files
set(SOURCES
    src/main.cpp
    src/MetadataReader.cpp
    src/Config.cpp
    src/engine/AudioEngine.cpp
    src/engine/FFmpegDecoder.cpp
    src/engine/EqProcessor.cpp
    src/engine/SpectrumAnalyzer.cpp
    src/MusicLibrary.cpp
    src/CoverArtWidget.cpp
    src/SpectrogramWidget.cpp
    src/GradientDialog.cpp
    src/EqualizerWidget.cpp
    src/TrackDelegate.cpp
    src/PlaylistModel.cpp
    src/MainWindow.cpp
)

set(HEADERS
    src/Track.h
    src/MetadataReader.h
    src/Config.h
    src/engine/AudioEngine.h
    src/MusicLibrary.h
    src/CoverArtWidget.h
    src/SpectrogramWidget.h
    src/GradientDialog.h
    src/EqualizerWidget.h
    src/TrackDelegate.h
    src/PlaylistModel.h
    src/MainWindow.h
)

set(RESOURCES 
    src/shaders.qrc
    src/application.qrc
)

add_executable(SubWave ${SOURCES} ${HEADERS} ${RESOURCES})

target_include_directories(SubWave PRIVATE src src/engine)

target_link_libraries(SubWave PRIVATE
    Qt6::Widgets
    Qt6::Multimedia
    Qt6::OpenGL
    Qt6::OpenGLWidgets
    PkgConfig::FFMPEG
    PkgConfig::FFTW
)

if(WIN32)
    add_custom_command(TARGET SubWave POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "$<TARGET_FILE:PkgConfig::FFMPEG>" "$<TARGET_FILE_DIR:SubWave>"
    )
endif()