cmake_minimum_required(VERSION 3.16)

# ============================================================================
#  Womo-Reise-App — CMake-Konfiguration (Multi-Plattform)
#  Qt 6 / C++17 / SQLite
#
#  Plattformen:
#    Linux / Windows  — Desktop-Build mit Seed-Mirror neben Binary
#    Android          — APK-Build mit Seed via Qt-Resources
#
#  Ziel: Eine CMakeLists.txt fuer alle Plattformen. Plattform-spezifische
#  Logik in if(ANDROID)- bzw. if(NOT ANDROID)-Bloecken.
# ============================================================================

project(womo_android 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 laeuft automatisch fuer Q_OBJECT-Klassen
#   AUTORCC: rcc laeuft automatisch fuer .qrc-Ressourcen
#   AUTOUIC: uic laeuft automatisch fuer .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
)

# ---------------------------------------------------------------------------
#  Android-spezifische Properties (vor qt_add_executable)
#
#  QT_ANDROID_ABIS:
#    Welche ABIs gebaut werden. Nur arm64-v8a (echtes Tablet) und
#    x86_64 (Emulator). armeabi-v7a und x86 sind veraltet.
#
#  QT_ANDROID_PACKAGE_SOURCE_DIR:
#    Verzeichnis mit AndroidManifest.xml, Java-Quellen, Gradle-Configs.
#    Qt nutzt diese Vorlagen beim APK-Bau.
#
#  QT_ANDROID_TARGET_SDK_VERSION:
#    API-Level fuer die App. 34 = Android 14 (aktuell, Play-Store-konform).
#
#  QT_ANDROID_MIN_SDK_VERSION:
#    Minimales Android. 23 = Android 6.0 (deckt 95%+ aller Geraete ab).
# ---------------------------------------------------------------------------
if(ANDROID)
    # Nur QT_ANDROID_ABIS bleibt global, weil es einen Konfigurationswert
    # darstellt, der nicht an ein konkretes Target gebunden ist.
    # Alle anderen Android-Properties (Package-Name, SDK-Versionen,
    # PACKAGE_SOURCE_DIR) werden NACH qt_add_executable via
    # set_target_properties gesetzt - das ist mit Qt 6.5+ der einzige
    # zuverlaessige Mechanismus, der das von Qt generierte
    # deployment-settings.json korrekt befuellt.
    set(QT_ANDROID_ABIS "arm64-v8a;x86_64")
endif()

# ---------------------------------------------------------------------------
#  Executable-Target mit allen Quellen
#
#  Plattform-unabhaengig: alle .cpp/.h/.ui-Dateien werden auf Linux,
#  Windows und Android gleich kompiliert. Plattform-Unterschiede regeln
#  wir via #ifdef Q_OS_ANDROID im Code, nicht im Build-System.
# ---------------------------------------------------------------------------
qt_add_executable(womo_android
    dbmanager.cpp
    dbmanager.h
    fsutils.cpp
    fsutils.h
    pfade.cpp
    pfade.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
    stammdaten.cpp
    stammdaten.h
)

# ---------------------------------------------------------------------------
#  Android: Target-spezifische Properties (Package-Name, SDK-Versionen)
#
#  Mit Qt 6.5+ werden Android-Properties bevorzugt als Target-Properties
#  gesetzt. Qt's androiddeployqt liest sie ein und schreibt sie ins
#  gradle.properties, das wiederum vom Gradle-Build verwendet wird.
#
#  Ohne QT_ANDROID_PACKAGE_NAME generiert Qt automatisch den Default
#  "org.qtproject.example.<target>", der unser eigenes Manifest
#  ueberschreibt. Daher hier explizit setzen.
# ---------------------------------------------------------------------------
if(ANDROID)
    set_target_properties(womo_android PROPERTIES
        QT_ANDROID_PACKAGE_NAME       "com.github.mar10777.womoreise"
        QT_ANDROID_MIN_SDK_VERSION     28
        QT_ANDROID_TARGET_SDK_VERSION  34
        QT_ANDROID_COMPILE_SDK_VERSION 36
        QT_ANDROID_VERSION_NAME        "1.0"
        QT_ANDROID_VERSION_CODE        1
        QT_ANDROID_PACKAGE_SOURCE_DIR  "${CMAKE_CURRENT_SOURCE_DIR}/android"
    )
endif()

# ---------------------------------------------------------------------------
#  Android: Seed-Asset als Qt-Resource einbinden
#
#  Auf Linux/Windows liegt das Seed neben der Binary als normales
#  Dateisystem-Verzeichnis. Auf Android gibt es kein "neben der Binary",
#  weil die App als APK (komprimiertes ZIP) deployt wird.
#
#  Loesung: seed.qrc bettet die Seed-Dateien direkt ins Binary ein.
#  Pfade::seedQuelle() greift unter Android auf "qrc:/seed/..." zu und
#  kopiert die Dateien beim Erststart in QStandardPaths::AppDataLocation.
# ---------------------------------------------------------------------------
if(ANDROID)
    target_sources(womo_android PRIVATE
        seed.qrc
    )
endif()

# ---------------------------------------------------------------------------
#  Uebersetzungen (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_android
    TS_FILES
        womo_de_DE.ts
        womo_en_US.ts
)

qt6_add_lrelease(womo_android
    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_android "translations"
    PREFIX "/i18n"
    BASE "${CMAKE_CURRENT_BINARY_DIR}"
    FILES ${QM_FILES}
)

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

# ===========================================================================
#  Plattform-spezifische Sektionen ab hier
# ===========================================================================

# ---------------------------------------------------------------------------
#  Desktop (Linux/Windows): 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
#            +-- Manual.pdf
#
#  Auf Android nicht noetig: dort uebernimmt seed.qrc die Einbettung.
# ---------------------------------------------------------------------------
if(NOT ANDROID)
    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_android_seed_mirror ALL
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${SEED_SOURCE_DIR}"
            "$<TARGET_FILE_DIR:womo_android>/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_android> - der Pfad braucht
    # das womo_android-Target). Ohne diese Abhaengigkeit gaebe es einen
    # Race bei parallelen Builds.
    add_dependencies(womo_android_seed_mirror womo_android)
endif()

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

# ---------------------------------------------------------------------------
#  Installations-Ziel (Linux)
#   Wird bei 'cmake --install <build-dir>' genutzt.
#   Nicht relevant fuer Entwicklungs-Workflow.
#   Auf Android nicht sinnvoll (APK wird via Qt Creator / adb deployt).
# ---------------------------------------------------------------------------
if(NOT ANDROID)
    install(TARGETS womo_android
        RUNTIME DESTINATION bin
    )
endif()
