cmake_minimum_required(VERSION 3.16)

# ============================================================================
#  Womo-Reise-App — CMake-Konfiguration
#  Qt 6 / C++17 / SQLite
# ============================================================================

project(womo VERSION 1.0 LANGUAGES CXX)

# ---------------------------------------------------------------------------
#  C++-Standard
# ---------------------------------------------------------------------------
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ---------------------------------------------------------------------------
#  Build-Typ: Default Debug, falls nichts gesetzt
# ---------------------------------------------------------------------------
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Debug CACHE STRING
        "Build-Typ: Debug, Release, RelWithDebInfo, MinSizeRel" FORCE)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
        Debug Release RelWithDebInfo MinSizeRel)
endif()

# ---------------------------------------------------------------------------
#  Clang Code Model: compile_commands.json erzeugen
#  (wird vom Editor-Live-Parser in Qt Creator / VSCode / CLion ausgewertet)
# ---------------------------------------------------------------------------
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# ---------------------------------------------------------------------------
#  Qt-Automatismen
#   AUTOMOC: moc läuft automatisch für Q_OBJECT-Klassen
#   AUTORCC: rcc läuft automatisch für .qrc-Ressourcen
#   AUTOUIC: uic läuft automatisch für .ui-Dateien
#   INCLUDE_CURRENT_DIR: generierte ui_*.h werden gefunden
# ---------------------------------------------------------------------------
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# ---------------------------------------------------------------------------
#  Qt-Pakete
# ---------------------------------------------------------------------------
find_package(Qt6 REQUIRED COMPONENTS
    Core
    Gui
    Widgets
    Sql
    Positioning
    LinguistTools
)

# ---------------------------------------------------------------------------
#  Windows-Icon: in womo.exe einbetten
#
#  Auf Windows nehmen Verknuepfungen, Taskleiste und Datei-Explorer
#  das Icon aus der eingebetteten Resource. Dafuer:
#    - src/womo.rc verweist auf das ICO
#    - das ICO ist Multi-Resolution (16/32/48/64/128/256), damit alle
#      Anzeigegroessen scharf sind
#    - Quelle: runtime/icon/womo-reise.ico (mit ImageMagick aus PNG
#      generiert — siehe Kommentar in womo.rc)
#
#  Auf Linux bleibt WIN32_ICON_RC leer; qt_add_executable filtert
#  leere Eintraege automatisch raus.
# ---------------------------------------------------------------------------
if(WIN32)
    set(WIN32_ICON_RC "${CMAKE_CURRENT_SOURCE_DIR}/womo.rc")
endif()

# ---------------------------------------------------------------------------
#  Executable-Target mit allen Quellen
# ---------------------------------------------------------------------------
qt_add_executable(womo
    ${WIN32_ICON_RC}
    dbmanager.cpp
    dbmanager.h
    fsutils.cpp
    fsutils.h
    pfade.cpp
    pfade.h
    stammdaten.cpp
    stammdaten.h
    backupWorker.cpp
    backupWorker.h
    downloadWorker.cpp
    downloadWorker.h
    loeschsicherung.cpp
    loeschsicherung.h
    loeschsicherung.ui
    main.cpp
    mainWomoStart.cpp
    mainWomoStart.h
    mainWomoStart.ui
    mainabfragen.cpp
    mainabfragen.h
    mainabfragen.ui
    mainauswahl.cpp
    mainauswahl.h
    mainauswahl.ui
    mainBackup.cpp
    mainBackup.h
    mainBackup.ui
    mainDownload.cpp
    mainDownload.h
    mainDownload.ui
    mainfahrzeug.cpp
    mainfahrzeug.h
    mainfahrzeug.ui
    mainfoto.cpp
    mainfoto.h
    mainfoto.ui
    mainkontakte.cpp
    mainkontakte.h
    mainkontakte.ui
    mainkosten.cpp
    mainkosten.h
    mainkosten.ui
    mainnav.cpp
    mainnav.h
    mainnav.ui
    mainreisekosten.cpp
    mainreisekosten.h
    mainreisekosten.ui
    maintanken.cpp
    maintanken.h
    maintanken.ui
    maintrip.cpp
    maintrip.h
    maintrip.ui
    mainumrechnung.cpp
    mainumrechnung.h
    mainumrechnung.ui
    mainverbrauch.cpp
    mainverbrauch.h
    mainverbrauch.ui
    mainwetter.cpp
    mainwetter.h
    mainwetter.ui
    meldung.cpp
    meldung.h
    meldung.ui
    reiseneu.cpp
    reiseneu.h
    reiseneu.ui
    framereise.cpp
    framereise.h
    framereise.ui
)

# ---------------------------------------------------------------------------
#  Übersetzungen (lupdate / lrelease)
#
#  womo_de_DE.ts ist die "Quell"-Sprache (deutsch), wird primaer als
#  Reverse-Lookup-Backup gehalten — bleibt typischerweise leer/identisch.
#  womo_en_US.ts haelt die englischen Uebersetzungen.
#
#  lupdate scannt die Source-Dateien (cpp+ui) auf tr()/Q_OBJECT-Strings
#  und schreibt sie in die .ts-Dateien, wobei vorhandene Uebersetzungen
#  erhalten bleiben.
#
#  lrelease kompiliert .ts -> .qm (binaer). Die QM-Files werden via
#  translations.qrc im Binary eingebettet, sodass die App ohne
#  externe Dateien lokalisierbar ist.
# ---------------------------------------------------------------------------
qt6_add_lupdate(womo
    TS_FILES
        womo_de_DE.ts
        womo_en_US.ts
)

qt6_add_lrelease(womo
    TS_FILES
        womo_de_DE.ts
        womo_en_US.ts
    QM_FILES_OUTPUT_VARIABLE QM_FILES
)

# QM-Files via Resource-Datei ins Binary einbetten. Dadurch braucht
# die deployte App keine externen Uebersetzungs-Dateien.
qt6_add_resources(womo "translations"
    PREFIX "/i18n"
    BASE "${CMAKE_CURRENT_BINARY_DIR}"
    FILES ${QM_FILES}
)

# ---------------------------------------------------------------------------
#  Qt-Bibliotheken verlinken
# ---------------------------------------------------------------------------
target_link_libraries(womo PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::Sql
    Qt6::Positioning
)



# ---------------------------------------------------------------------------
#  Seed-Asset spiegeln (nach jedem Build)
#
#  Beim Erststart kopiert Pfade::seedWennNoetig() das Seed-Asset von
#  <bindir>/seed/ in das User-Datenverzeichnis (~/.local/share/Womo-Reise/
#  unter Linux). Hier sorgen wir dafuer, dass <bindir>/seed/ immer
#  einen frischen Spiegel von <repo>/runtime/seed/ enthaelt.
#
#  Layout im Repo:
#    runtime/seed/
#    +-- womo_reise.db        (Test-DB mit Stammdaten + Testreisen)
#    +-- PDF/
#        +-- Fotos/           (leer)
#        +-- Navigation/      (leer)
#        +-- Texte/
#            +-- Anleitung.pdf
#
#  Hinweis fuer Deploy (Etappe 4): Beim spaeteren Linux/Windows-Deploy
#  wird das Seed-Asset nicht neben die Binary kopiert, sondern in einen
#  Standard-Pfad (z.B. /usr/share/Womo-Reise/seed/). Dafuer wird in
#  Pfade::seedWennNoetig() ein zweiter Such-Pfad ergaenzt; CMake bekommt
#  ein install()-Target. Beides bleibt fuer Etappe 4.
#
#  Quell-Basis: <src/>/../runtime/seed/  =  Projekt-Root/runtime/seed/
#  Ziel:        $<TARGET_FILE_DIR:womo>/seed/
# ---------------------------------------------------------------------------
set(SEED_SOURCE_DIR "${CMAKE_SOURCE_DIR}/../runtime/seed")

# Sanity-Check: Seed-Verzeichnis muss existieren, sonst kann ein neu
# installiertes System nicht starten.
if(NOT EXISTS "${SEED_SOURCE_DIR}/womo_reise.db")
    message(WARNING
        "Seed-DB nicht gefunden: ${SEED_SOURCE_DIR}/womo_reise.db\n"
        "  Beim Erststart wird die App keine Stammdaten haben.")
endif()
if(NOT EXISTS "${SEED_SOURCE_DIR}/PDF")
    message(WARNING
        "Seed-PDF-Verzeichnis nicht gefunden: ${SEED_SOURCE_DIR}/PDF\n"
        "  Beim Erststart wird kein PDF-Grundgeruest gesetzt.")
endif()

# Seed-Verzeichnis bei jedem Build neben die Binary spiegeln. Idempotent
# (copy_directory ueberschreibt vorhandene Inhalte mit den Quellversionen).
# Spiegelung statt einmaliger Kopie, damit Aenderungen am Seed (z.B. neue
# Anleitung.pdf) ohne CMake-Reset wirksam werden.
#
# Realisierung: separates ALL-Target statt POST_BUILD-Hook am womo-Target.
# Das alte POST_BUILD lief nur, wenn womo selbst neu gebaut wurde - nicht
# bei reinen Seed-Aenderungen (neue runtime/seed/womo_reise.db ohne
# Source-Edit). Mit ALL-Target laeuft die Spiegelung bei jedem
# 'cmake --build', unabhaengig davon ob womo selbst neu gebaut wurde.
# Idempotent: copy_directory ueberschreibt nur wo noetig.
add_custom_target(womo_seed_mirror ALL
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        "${SEED_SOURCE_DIR}"
        "$<TARGET_FILE_DIR:womo>/seed"
    COMMENT "Spiegele Seed-Asset (runtime/seed -> <bindir>/seed)"
    VERBATIM
)

# Dependency: Seed muss erst gespiegelt werden, nachdem die Binary
# existiert (wegen $<TARGET_FILE_DIR:womo> - der Pfad braucht das
# womo-Target). Ohne diese Abhaengigkeit gaebe es einen Race bei
# parallelen Builds.
add_dependencies(womo_seed_mirror womo)

# ---------------------------------------------------------------------------
#  Windows-Deployment (auskommentiert, Vorbereitung für Cross-Platform-Build)
#   Wenn wir die Windows-Variante integrieren, diesen Block aktivieren.
#   windeployqt.exe kopiert alle benötigten Qt-DLLs neben die Binary.
# ---------------------------------------------------------------------------
# if(WIN32)
#     find_program(WINDEPLOYQT_EXECUTABLE windeployqt
#         HINTS "${Qt6_DIR}/../../../bin"
#     )
#     if(WINDEPLOYQT_EXECUTABLE)
#         add_custom_command(TARGET womo POST_BUILD
#             COMMAND "${WINDEPLOYQT_EXECUTABLE}" "$<TARGET_FILE:womo>"
#             COMMENT "Windows: windeployqt für portable Deployment"
#         )
#     endif()
# endif()

# ---------------------------------------------------------------------------
#  Installations-Ziel (Linux)
#   Wird bei 'cmake --install <build-dir>' genutzt.
#   Nicht relevant für Entwicklungs-Workflow.
# ---------------------------------------------------------------------------
install(TARGETS womo
    RUNTIME DESTINATION bin
)
