cmake_minimum_required(VERSION 3.22)
project(SubWave LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# dependencies
find_package(Qt6 REQUIRED COMPONENTS
    Core Widgets Multimedia OpenGL OpenGLWidgets
)
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET
    libavformat
    libavcodec
    libavutil
    libswresample
)
pkg_check_modules(FFTW REQUIRED IMPORTED_TARGET fftw3)
# sources
set(SOURCES
    src/main.cpp
    src/config/Config.cpp
    src/gui/CoverArtWidget.cpp
    src/gui/SpectrogramWidget.cpp
    src/gui/GradientDialog.cpp
    src/gui/EqualizerWidget.cpp
    src/gui/EqualizerPresetManager.cpp
    src/gui/FreqCurveWidget.cpp
    src/gui/TrackDelegate.cpp
    src/gui/MainWindow.cpp
    src/gui/NowPlayingPanel.cpp
    # controllers
    src/controllers/PlaybackController.cpp
    src/controllers/LibraryController.cpp
    # engine
    src/engine/AudioEngine.cpp
    src/engine/EqProcessor.cpp
    src/engine/SpectrumAnalyzer.cpp
    src/engine/MusicLibrary.cpp
    src/engine/MetadataReader.cpp
    # engine/encoder
    src/engine/encoder/AlbumReencoder.cpp
    src/engine/encoder/TrackEncoder.cpp
    src/engine/encoder/StageBuffer.cpp
    # ffmpeg
    src/engine/ffmpeg/FormatContext.cpp
    src/engine/ffmpeg/CodecContext.cpp
    src/engine/ffmpeg/Resampler.cpp
    src/engine/ffmpeg/FFmpegDecoder.cpp
    # playlists
    src/playlists/PlaylistModel.cpp
    src/playlists/PlaylistManager.cpp
    src/playlists/PlaylistCreatorDialog.cpp
    src/playlists/PlaylistBrowserDialog.cpp
    # reencode
    src/gui/ReencodeDialog.cpp
)
set(HEADERS
    src/config/Config.h
    src/gui/CoverArtWidget.h
    src/gui/SpectrogramWidget.h
    src/gui/GradientDialog.h
    src/gui/EqualizerWidget.h
    src/gui/EqualizerPresetManager.h
    src/gui/FreqCurveWidget.h
    src/gui/TrackDelegate.h
    src/gui/MainWindow.h
    src/gui/NowPlayingPanel.h
    # controllers
    src/controllers/PlaybackController.h
    src/controllers/LibraryController.h
    # engine
    src/engine/AudioEngine.h
    src/engine/EqProcessor.h
    src/engine/SpectrumAnalyzer.h
    src/engine/AudioBuffer.h
    src/engine/Track.h
    src/engine/MetadataReader.h
    src/engine/MusicLibrary.h
    # engine/encoder
    src/engine/encoder/ReencodeJob.h
    src/engine/encoder/AlbumReencoder.h
    src/engine/encoder/TrackEncoder.h
    src/engine/encoder/StageBuffer.h
    src/engine/encoder/FfmpegGuards.h
    src/engine/encoder/SampleRateUtils.h
    # ffmpeg wrapper
    src/engine/ffmpeg/FormatContext.h
    src/engine/ffmpeg/CodecContext.h
    src/engine/ffmpeg/Resampler.h
    src/engine/ffmpeg/FFmpegDecoder.h
    # playlists
    src/playlists/PlaylistModel.h
    src/playlists/PlaylistManager.h
    src/playlists/PlaylistCreatorDialog.h
    src/playlists/PlaylistBrowserDialog.h
    # reencode
    src/gui/ReencodeDialog.h
)
# qrc resources
set(RESOURCES
    src/shaders.qrc
    src/application.qrc
)
# target
add_executable(SubWave ${SOURCES} ${HEADERS} ${RESOURCES})
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
    set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build." FORCE)
endif()
if(MSVC)
    target_compile_options(SubWave PRIVATE /O2 /fp:fast)
else()
    target_compile_options(SubWave PRIVATE -O3 -ffast-math -march=native)
endif()
# headers
target_include_directories(SubWave PRIVATE
    src
    src/config
    src/controllers
    src/engine
    src/engine/encoder
    src/engine/ffmpeg
    src/playlists
    src/gui
)
# link to qt and ffmpeg and fftw
target_link_libraries(SubWave PRIVATE
    Qt6::Core
    Qt6::Widgets
    Qt6::Multimedia
    Qt6::OpenGL
    Qt6::OpenGLWidgets
    PkgConfig::FFMPEG
    PkgConfig::FFTW
)
# For windows stupid ahh
if(WIN32)
    set_target_properties(SubWave PROPERTIES WIN32_EXECUTABLE TRUE)
endif()
