cmake_minimum_required(VERSION 3.5)

project(LogDoctor VERSION 4.00 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(MSVC)
    add_compile_options(/W2)
    set(CMAKE_CXX_FLAGS_MINSIZEREL "/Os")
    set(CMAKE_CXX_FLAGS_RELEASE "/O2")
else()
    add_compile_options(-Wall -Wextra -Wpedantic)
    set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os")
    set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
endif()

find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core Widgets Charts LinguistTools Sql Network)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets Charts LinguistTools Sql Network)

if(${QT_VERSION_MAJOR} LESS 6)
    message("Error: Qt6 or greater required")
    return()
endif()


set(TS_FILES
    translations/LogDoctor_en_GB.ts
    translations/LogDoctor_es_ES.ts
    translations/LogDoctor_fr_FR.ts
    translations/LogDoctor_it_IT.ts
    translations/LogDoctor_ja_JP.ts
    translations/LogDoctor_pt_BR.ts
)


set(PROJECT_SOURCES
    main.cpp
    mainwindow.ui
    mainwindow.h
    mainwindow.cpp

    main_lib.h

    globals/db_names.h
    globals/db_names.cpp
    globals/global_configs.h
    globals/global_configs.cpp

    customs/logfile_treewidgetitem.h
    customs/models/logfields_listmodel.h
    customs/models/logfields_listmodel.cpp

    utilities/arrays.h
    utilities/bwlists.h
    utilities/bwutils.cpp
    utilities/chars.h
    utilities/checks.h
    utilities/checks.cpp
    utilities/colors.h
    utilities/colors.cpp
    utilities/gzip.h
    utilities/gzip.cpp
    utilities/io.h
    utilities/io.cpp
    utilities/memory.h
    utilities/memory.cpp
    utilities/printables.h
    utilities/printables.cpp
    utilities/rtf.h
    utilities/rtf.cpp
    utilities/strings.h
    utilities/strings.cpp
    utilities/stylesheets.h
    utilities/stylesheets.cpp
    utilities/vectors.h

    modules/shared.h

    modules/exceptions.h
    modules/exceptions.cpp
    modules/tb.h
    modules/tb.cpp

    modules/database/database.h
    modules/database/database.cpp

    modules/dialogs.h
    modules/dialogs.cpp
    modules/dialogs/message_dialog.ui
    modules/dialogs/message_dialog.h
    modules/dialogs/message_dialog.cpp
    modules/dialogs/boolean_dialog.ui
    modules/dialogs/boolean_dialog.h
    modules/dialogs/boolean_dialog.cpp
    modules/dialogs/ida_dialog.ui
    modules/dialogs/ida_dialog.h
    modules/dialogs/ida_dialog.cpp

    modules/blacklists/blacklists.h
    modules/blacklists/blacklists.cpp
    modules/blacklists/modules/lib.h
    modules/blacklists/modules/blacklist.h
    modules/blacklists/modules/blacklist.cpp
    modules/blacklists/modules/blacklist_item.h
    modules/blacklists/modules/blacklist_item.cpp

    modules/warnlists/warnlists.h
    modules/warnlists/warnlists.cpp
    modules/warnlists/modules/lib.h
    modules/warnlists/modules/warnlist.h
    modules/warnlists/modules/warnlist.cpp
    modules/warnlists/modules/warnlist_item.h
    modules/warnlists/modules/warnlist_item.cpp

    modules/craplog/lib.h
    modules/craplog/craplog.h
    modules/craplog/craplog.cpp
    modules/craplog/modules/lib.h
    modules/craplog/modules/datetime.h
    modules/craplog/modules/datetime.cpp
    modules/craplog/modules/donuts.h
    modules/craplog/modules/donuts.cpp
    modules/craplog/modules/formats.h
    modules/craplog/modules/formats.cpp
    modules/craplog/modules/hash.h
    modules/craplog/modules/hash.cpp
    modules/craplog/modules/logs.h
    modules/craplog/modules/logs.cpp
    modules/craplog/modules/sha256.h
    modules/craplog/modules/sha256.cpp
    modules/craplog/modules/workers/lib.h
    modules/craplog/modules/workers/lister.h
    modules/craplog/modules/workers/lister.cpp
    modules/craplog/modules/workers/parser.h
    modules/craplog/modules/workers/parser.cpp
    modules/craplog/modules/workers/impl/loglinedata.cpp

    modules/crapview/lib.h
    modules/crapview/crapview.h
    modules/crapview/crapview.cpp
    modules/crapview/modules/lib.h
    modules/crapview/modules/filters.h
    modules/crapview/modules/filters.cpp
    modules/crapview/modules/query.h
    modules/crapview/modules/query.cpp

    modules/craphelp/craphelp.ui
    modules/craphelp/craphelp.h
    modules/craphelp/craphelp.cpp

    modules/crapup/crapup.ui
    modules/crapup/crapup.h
    modules/crapup/crapup.cpp
    modules/crapup/modules/stylesheets.h
    modules/crapup/modules/stylesheets.cpp

    modules/crapinfo/crapinfo.ui
    modules/crapinfo/crapinfo.h
    modules/crapinfo/crapinfo.cpp
    modules/crapinfo/modules/stylesheets.h
    modules/crapinfo/modules/stylesheets.cpp

    modules/changelog/changelog.ui
    modules/changelog/changelog.h
    modules/changelog/changelog.cpp
    modules/changelog/modules/stylesheets.h
    modules/changelog/modules/stylesheets.cpp

    tools/crappath/crappath.h
    tools/crappath/crappath.cpp

    tools/crapnote/crapnote.ui
    tools/crapnote/crapnote.h
    tools/crapnote/crapnote.cpp
    tools/crapnote/modules/stylesheets.h
    tools/crapnote/modules/stylesheets.cpp

    games/game_dialog.ui
    games/game_dialog.h
    games/game_dialog.cpp
    games/crisscross/crisscross.ui
    games/crisscross/game.h
    games/crisscross/game.cpp
    games/crisscross/modules/stylesheets.h
    games/crisscross/modules/stylesheets.cpp

    games/snake/snake.ui
    games/snake/game.h
    games/snake/game.cpp
    games/snake/snake.h
    games/snake/snake.cpp
    games/snake/food.h
    games/snake/food.cpp
    games/snake/modules/stylesheets.h
    games/snake/modules/stylesheets.cpp

    resources/resources.qrc
    ${TS_FILES}
)

qt_add_executable(LogDoctor
    MANUAL_FINALIZATION
    ${PROJECT_SOURCES}
)
qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})

if(WIN32)
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic -lstdc++ -lwinpthread")
    target_link_libraries(LogDoctor PRIVATE
        -static Qt${QT_VERSION_MAJOR}::Core
        -static Qt${QT_VERSION_MAJOR}::Widgets
        -static Qt${QT_VERSION_MAJOR}::Charts
        -static Qt${QT_VERSION_MAJOR}::Sql
        -static Qt${QT_VERSION_MAJOR}::Network
    )
else()
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
    target_link_libraries(LogDoctor PRIVATE
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Widgets
        Qt${QT_VERSION_MAJOR}::Charts
        Qt${QT_VERSION_MAJOR}::Sql
        Qt${QT_VERSION_MAJOR}::Network
    )
    # Include zlib
    find_package(ZLIB REQUIRED)
    include_directories(${ZLIB_INCLUDE_DIRS})
    target_link_libraries(LogDoctor PRIVATE ${ZLIB_LIBRARIES})
endif()


if(WIN32)
    set_target_properties(LogDoctor PROPERTIES
        WIN32_EXECUTABLE TRUE
    )
elseif(APPLE)
    set_target_properties(LogDoctor PROPERTIES
        MACOSX_BUNDLE TRUE
        #MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
        MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}
        MACOSX_BUNDLE_ICON_FILE ${PROJECT_NAME}
        MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
        MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    )
endif()

qt_finalize_executable(LogDoctor)



# CTest
include(CTest)
enable_testing()
add_executable(LogDocTester
    tests/main.cpp
    tests/white_box.h
    tests/white_box.cpp
    # 2 test
    modules/exceptions.h
    modules/exceptions.cpp
    modules/craplog/modules/lib.h
    modules/craplog/modules/workers/lib.h
    modules/craplog/modules/workers/impl/loglinedata.cpp
    utilities/gzip.h
    utilities/gzip.cpp
    utilities/io.h
    utilities/io.cpp
    utilities/strings.h
    utilities/strings.cpp
    utilities/vectors.h
    modules/craplog/modules/datetime.h
    modules/craplog/modules/datetime.cpp
    modules/craplog/modules/formats.h
    modules/craplog/modules/formats.cpp
    modules/craplog/modules/logs.h
    modules/craplog/modules/logs.cpp
    modules/crapview/modules/filters.h
    modules/crapview/modules/filters.cpp
)
if(WIN32)
    target_link_libraries(LogDocTester PRIVATE
        -static Qt${QT_VERSION_MAJOR}::Widgets
        #-static Qt${QT_VERSION_MAJOR}::Sql
    )
else()
    target_link_libraries(LogDocTester PRIVATE
        Qt${QT_VERSION_MAJOR}::Widgets
        #Qt${QT_VERSION_MAJOR}::Sql
        ${ZLIB_LIBRARIES}
    )
endif()
add_test(
  NAME LogDocTester
  COMMAND $<TARGET_FILE:LogDocTester>
)


# Deb/Flatpak
if(UNIX AND NOT APPLE)
    install(TARGETS
        LogDoctor
            RUNTIME DESTINATION /usr/bin
            CONFIGURATIONS Release
            PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ
            RENAME logdoctor
    )

    install(FILES
        ${CMAKE_SOURCE_DIR}/installation_stuff/LogDoctor.desktop
            DESTINATION /usr/share/applications
    )

    install(DIRECTORY
        DESTINATION /usr/share/LogDoctor
    )
    install(FILES
        ${CMAKE_SOURCE_DIR}/installation_stuff/LogDoctor.svg
            DESTINATION /usr/share/LogDoctor
    )
    install(DIRECTORY
        ${CMAKE_SOURCE_DIR}/installation_stuff/logdocdata/help
            DESTINATION /usr/share/LogDoctor
    )
    install(DIRECTORY
        ${CMAKE_SOURCE_DIR}/installation_stuff/logdocdata/licenses
            DESTINATION /usr/share/LogDoctor
    )
endif()
