cmake_minimum_required(VERSION 3.16)

project(BareCode
    VERSION 1.3.2
    DESCRIPTION "A modular code editor built with Qt6"
    LANGUAGES CXX
)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

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

# ---------------------------------------------------------------------------
# Plattform-Erkennung
# ---------------------------------------------------------------------------
if(WIN32)
    set(PLATFORM_WINDOWS TRUE)
    add_compile_definitions(PLATFORM_WINDOWS)
    set(CMAKE_WIN32_EXECUTABLE ON)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Haiku")
    set(PLATFORM_HAIKU TRUE)
    add_compile_definitions(PLATFORM_HAIKU)
elseif(APPLE)
    set(PLATFORM_MACOS TRUE)
    add_compile_definitions(PLATFORM_MACOS)
elseif(UNIX)
    set(PLATFORM_LINUX TRUE)
    add_compile_definitions(PLATFORM_LINUX)
endif()

# ---------------------------------------------------------------------------
# Qt6
# ---------------------------------------------------------------------------
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Concurrent LinguistTools)
qt_standard_project_setup()

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
add_subdirectory(src)

# ---------------------------------------------------------------------------
# Übersetzungen — lrelease → .qm → ins Build-Verzeichnis
#
# Qt6::lrelease kommt aus der Komponente "LinguistTools" (siehe find_package
# oben) und funktioniert plattformunabhängig, unabhängig davon, wo lrelease
# tatsächlich installiert ist. Ein manuelles find_program() mit fest
# verdrahteten Pfaden ist NICHT portabel: einige Distributionen installieren
# Qt6 nicht unter /usr, sondern in einen eigenen Unterbaum (z. B. Void Linux
# unter /usr/lib/qt6/...), wodurch ein relativer Pfad wie
# "${Qt6_DIR}/../../../bin" ins Leere zeigt.
# ---------------------------------------------------------------------------

set(TS_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/translations/barecode_de.ts
    ${CMAKE_CURRENT_SOURCE_DIR}/translations/barecode_en.ts
)

set(QM_FILES)
foreach(TS_FILE ${TS_FILES})
    get_filename_component(TS_NAME ${TS_FILE} NAME_WE)
    set(QM_FILE "${CMAKE_CURRENT_BINARY_DIR}/translations/${TS_NAME}.qm")
    add_custom_command(
        OUTPUT  "${QM_FILE}"
        COMMAND ${CMAKE_COMMAND} -E make_directory
                "${CMAKE_CURRENT_BINARY_DIR}/translations"
        COMMAND Qt6::lrelease "${TS_FILE}" -qm "${QM_FILE}"
        DEPENDS "${TS_FILE}"
        COMMENT "lrelease: ${TS_NAME}.qm"
        VERBATIM
    )
    list(APPEND QM_FILES "${QM_FILE}")
endforeach()

add_custom_target(BareCode_translations ALL DEPENDS ${QM_FILES})

# ---------------------------------------------------------------------------
# Resources
# ---------------------------------------------------------------------------
qt_add_resources(BARECODE_RESOURCES resources/resources.qrc)

# ---------------------------------------------------------------------------
# Executable
# ---------------------------------------------------------------------------
if(PLATFORM_WINDOWS)
    qt_add_executable(BareCode main.cpp BareCode.rc ${BARECODE_RESOURCES})
else()
    qt_add_executable(BareCode main.cpp ${BARECODE_RESOURCES})
endif()

add_dependencies(BareCode BareCode_translations)

target_link_libraries(BareCode PRIVATE
    BareCode_Core
    BareCode_Editor
    BareCode_FileTree
    BareCode_Highlighter
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
)

target_include_directories(BareCode PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
)

# ---------------------------------------------------------------------------
# Installation
# ---------------------------------------------------------------------------
include(GNUInstallDirs)

install(TARGETS BareCode
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(FILES LICENSE
    DESTINATION ${CMAKE_INSTALL_DATADIR}/licenses/barecode
)

# .qm-Dateien installieren
install(FILES ${QM_FILES}
    DESTINATION ${CMAKE_INSTALL_DATADIR}/BareCode/translations
)

if(PLATFORM_LINUX)
    foreach(SIZE 16 32 48 64 128 256 512)
        install(FILES resources/icon_${SIZE}.png
            DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/${SIZE}x${SIZE}/apps
            RENAME barecode.png
        )
    endforeach()
    install(FILES BareCode.desktop
        DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
    )
endif()

if(PLATFORM_HAIKU)
    install(FILES resources/icon_256.png
        DESTINATION ${CMAKE_INSTALL_DATADIR}/BareCode
        RENAME BareCode.png
    )
    install(CODE "
        execute_process(
            COMMAND mimeset -f \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/BareCode\"
            RESULT_VARIABLE _mimeset_result
        )
        if(NOT _mimeset_result EQUAL 0)
            message(WARNING \"mimeset konnte nicht ausgeführt werden.\")
        endif()
    ")
endif()

if(PLATFORM_MACOS)
    set_target_properties(BareCode PROPERTIES
        MACOSX_BUNDLE TRUE
        MACOSX_BUNDLE_BUNDLE_NAME "BareCode"
        MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
        MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION}
    )
endif()
