cmake_minimum_required(VERSION 3.16)

project(cdguy
    VERSION 0.1.0
    DESCRIPTION "CD, CD+G and MP3+G player and ripper in the spirit of Windows Media Player 11"
    LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()

# ---------------------------------------------------------------------------
# Qt: build with Qt 6 when available, otherwise fall back to Qt 5.
# ---------------------------------------------------------------------------
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
message(STATUS "Building cdguy against Qt ${QT_VERSION_MAJOR}")

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS
    Core
    Gui
    Widgets
    Network
    Sql
    Multimedia
)

find_package(ZLIB REQUIRED)
find_package(PkgConfig QUIET)

# Codec libraries are optional: the application degrades gracefully and can
# shell out to external encoders (flac, lame, oggenc, faac, ffmpeg).
option(CDGUY_WITH_FDKAAC "Build the native Fraunhofer FDK-AAC encoder (non-free on many distros)" OFF)

set(CDGUY_HAVE_FLAC   OFF)
set(CDGUY_HAVE_VORBIS OFF)
set(CDGUY_HAVE_LAME   OFF)
set(CDGUY_HAVE_FDKAAC OFF)

if (PkgConfig_FOUND)
    pkg_check_modules(FLAC flac)
    if (FLAC_FOUND)
        set(CDGUY_HAVE_FLAC ON)
    endif()
    pkg_check_modules(VORBIS vorbis>=1.2 ogg>=1.2 vorbisenc>=1.2 vorbisfile>=1.2)
    if (VORBIS_FOUND)
        set(CDGUY_HAVE_VORBIS ON)
    endif()
    pkg_check_modules(LAME lame>=3.98)
    if (LAME_FOUND)
        set(CDGUY_HAVE_LAME ON)
    endif()
    if (CDGUY_WITH_FDKAAC)
        pkg_check_modules(FDKAAC fdk-aac>=0.1)
        if (FDKAAC_FOUND)
            set(CDGUY_HAVE_FDKAAC ON)
        else()
            message(WARNING "CDGUY_WITH_FDKAAC requested but fdk-aac was not found; disabling native AAC")
        endif()
    endif()
endif()

if (CDGUY_HAVE_FLAC)
    message(STATUS "Native FLAC encode/decode: enabled")
else()
    message(STATUS "Native FLAC encode/decode: DISABLED (libFLAC not found)")
endif()
if (CDGUY_HAVE_VORBIS)
    message(STATUS "Native Ogg Vorbis encode/decode: enabled")
else()
    message(STATUS "Native Ogg Vorbis encode/decode: DISABLED (libvorbis not found)")
endif()
if (CDGUY_HAVE_LAME)
    message(STATUS "Native MP3 encode/decode: enabled")
else()
    message(STATUS "Native MP3 encode/decode: DISABLED (libmp3lame not found)")
endif()
if (CDGUY_HAVE_FDKAAC)
    message(STATUS "Native AAC (FDK) encode: enabled")
else()
    message(STATUS "Native AAC (FDK) encode: DISABLED")
endif()

configure_file(src/core/BuildFeatures.h.in src/core/BuildFeatures.h @ONLY)

set(CDGUY_SOURCES
    src/main.cpp
    src/core/Util.cpp
    src/core/Settings.cpp
    src/core/DiscMonitor.cpp
    src/core/MmcDevice.cpp
    src/core/CdText.cpp
    src/core/DiscId.cpp
    src/core/CddaReader.cpp
    src/core/CdgDecoder.cpp
    src/core/CdgSources.cpp
    src/core/CueParser.cpp
    src/core/MiniZip.cpp
    src/core/IsoReader.cpp
    src/core/AudioEngine.cpp
    src/core/AudioSources.cpp
    src/core/Equalizer.cpp
    src/core/Fft.cpp
    src/core/Lyrics.cpp
    src/core/MetadataClients.cpp
    src/core/MetadataResolver.cpp
    src/core/LibraryDb.cpp
    src/core/TagWriter.cpp
    src/core/Encoders.cpp
    src/core/Ripper.cpp
    src/core/Burner.cpp
    src/core/PlaybackController.cpp
    src/ui/ThemeManager.cpp
    src/ui/MainWindow.cpp
    src/ui/TransportBar.cpp
    src/ui/NowPlayingWidget.cpp
    src/ui/VisualizerWidget.cpp
    src/ui/CdgWidget.cpp
    src/ui/LyricsWidget.cpp
    src/ui/PlaylistPane.cpp
    src/ui/LibraryView.cpp
    src/ui/RipDialog.cpp
    src/ui/OptionsDialog.cpp
    src/ui/EqDialog.cpp
    src/ui/DiscInfoDialog.cpp
    src/ui/SelfTest.cpp
)

set(CDGUY_HEADERS
    src/core/Util.h
    src/core/Settings.h
    src/core/DiscModel.h
    src/core/DiscMonitor.h
    src/core/MmcDevice.h
    src/core/CdText.h
    src/core/DiscId.h
    src/core/CddaReader.h
    src/core/CdgDecoder.h
    src/core/CdgSources.h
    src/core/CueParser.h
    src/core/MiniZip.h
    src/core/IsoReader.h
    src/core/AudioEngine.h
    src/core/AudioSources.h
    src/core/Equalizer.h
    src/core/Fft.h
    src/core/Lyrics.h
    src/core/MetadataClients.h
    src/core/MetadataResolver.h
    src/core/LibraryDb.h
    src/core/TagWriter.h
    src/core/Encoders.h
    src/core/Ripper.h
    src/core/Burner.h
    src/core/PlaybackController.h
    src/core/Version.h
    src/ui/ThemeManager.h
    src/ui/MainWindow.h
    src/ui/TransportBar.h
    src/ui/NowPlayingWidget.h
    src/ui/VisualizerWidget.h
    src/ui/CdgWidget.h
    src/ui/LyricsWidget.h
    src/ui/PlaylistPane.h
    src/ui/LibraryView.h
    src/ui/RipDialog.h
    src/ui/OptionsDialog.h
    src/ui/EqDialog.h
    src/ui/DiscInfoDialog.h
    src/ui/SelfTest.h
)

add_executable(cdguy WIN32 MACOSX_BUNDLE
    ${CDGUY_SOURCES}
    ${CDGUY_HEADERS}
    src/ui/cdguy.qrc
)

target_include_directories(cdguy PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}/src/core
    src
    src/core
    src/ui
)

target_link_libraries(cdguy PRIVATE
    Qt${QT_VERSION_MAJOR}::Core
    Qt${QT_VERSION_MAJOR}::Gui
    Qt${QT_VERSION_MAJOR}::Widgets
    Qt${QT_VERSION_MAJOR}::Network
    Qt${QT_VERSION_MAJOR}::Sql
    Qt${QT_VERSION_MAJOR}::Multimedia
    ZLIB::ZLIB
)

if (CDGUY_HAVE_FLAC)
    target_link_libraries(cdguy PRIVATE ${FLAC_LIBRARIES})
    target_include_directories(cdguy PRIVATE ${FLAC_INCLUDE_DIRS})
    target_link_directories(cdguy PRIVATE ${FLAC_LIBRARY_DIRS})
    target_compile_definitions(cdguy PRIVATE CDGUY_HAVE_FLAC=1)
endif()
if (CDGUY_HAVE_VORBIS)
    target_link_libraries(cdguy PRIVATE ${VORBIS_LIBRARIES})
    target_include_directories(cdguy PRIVATE ${VORBIS_INCLUDE_DIRS})
    target_link_directories(cdguy PRIVATE ${VORBIS_LIBRARY_DIRS})
    target_compile_definitions(cdguy PRIVATE CDGUY_HAVE_VORBIS=1)
endif()
if (CDGUY_HAVE_LAME)
    target_link_libraries(cdguy PRIVATE ${LAME_LIBRARIES})
    target_include_directories(cdguy PRIVATE ${LAME_INCLUDE_DIRS})
    target_link_directories(cdguy PRIVATE ${LAME_LIBRARY_DIRS})
    target_compile_definitions(cdguy PRIVATE CDGUY_HAVE_LAME=1)
endif()
if (CDGUY_HAVE_FDKAAC)
    target_link_libraries(cdguy PRIVATE ${FDKAAC_LIBRARIES})
    target_include_directories(cdguy PRIVATE ${FDKAAC_INCLUDE_DIRS})
    target_link_directories(cdguy PRIVATE ${FDKAAC_LIBRARY_DIRS})
    target_compile_definitions(cdguy PRIVATE CDGUY_HAVE_FDKAAC=1)
endif()

# Keep local developer builds (devel RPMs unpacked into a prefix) runnable.
if (FLAC_LIBRARY_DIRS)
    set_target_properties(cdguy PROPERTIES BUILD_RPATH "${FLAC_LIBRARY_DIRS}")
endif()

if (UNIX AND NOT APPLE)
    include(GNUInstallDirs)
    install(TARGETS cdguy DESTINATION ${CMAKE_INSTALL_BINDIR})
    install(FILES packaging/cdguy.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
    install(FILES packaging/cdguy.svg DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps)
endif()
