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/TrackDelegate.cpp
    src/gui/MainWindow.cpp

    # engine
    src/engine/AudioEngine.cpp
    src/engine/EqProcessor.cpp
    src/engine/SpectrumAnalyzer.cpp
    src/engine/MusicLibrary.cpp
    src/engine/MetadataReader.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
)

set(HEADERS
    src/config/Config.h

    src/gui/CoverArtWidget.h
    src/gui/SpectrogramWidget.h
    src/gui/GradientDialog.h
    src/gui/EqualizerWidget.h
    src/gui/TrackDelegate.h
    src/gui/MainWindow.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

    # 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
)

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

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

# headers
target_include_directories(SubWave PRIVATE
    src
    src/config
    src/engine
    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()
