cmake_minimum_required(VERSION 3.20)
project(TrackDesigner VERSION 1.3.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Windows-only compile definitions. These are MSVC/Win32 specific and must
# not leak to the macOS (clang) build.
if(WIN32)
    add_compile_definitions(_USE_MATH_DEFINES WIN32_LEAN_AND_MEAN NOMINMAX)
endif()

# -- wxWidgets ------------------------------------------------------------------
find_package(wxWidgets CONFIG QUIET COMPONENTS core base xml adv gl)
if(NOT wxWidgets_FOUND)
    find_package(wxWidgets REQUIRED COMPONENTS core base xml adv gl)
    include(${wxWidgets_USE_FILE})
else()
    message(STATUS "Found wxWidgets via config mode")
endif()

# -- OpenGL ---------------------------------------------------------------------
find_package(OpenGL REQUIRED)

# -- MarklinCommon subproject ---------------------------------------------------
add_subdirectory(../MarklinCommon ${CMAKE_CURRENT_BINARY_DIR}/MarklinCommon)

# -- Sources --------------------------------------------------------------------
set(TD_SOURCES
    App.cpp
    Paths.cpp
    MainFrame.cpp
    SplashDialog.cpp
    LayoutShapeDialog.cpp
    LevelManagerDialog.cpp
    PrintOptionsDialog.cpp
    LayoutPrintout.cpp
    canvas/CanvasState.cpp
    canvas/Renderer.cpp
    io/LayoutXml.cpp
    panels/CanvasPanel.cpp
    panels/PalettePanel.cpp
    panels/PiecePreviewPopup.cpp
    panels/PropertiesPanel.cpp
    view3d/View3DFrame.cpp
)

# resources.rc embeds the images on Windows only. On macOS the images are
# compiled in via EmbeddedImages.h, so the .rc is excluded entirely.
if(WIN32)
    list(APPEND TD_SOURCES resources.rc)
endif()

# Executable type differs per platform:
#   WIN32         -> GUI subsystem app (no console window)
#   MACOSX_BUNDLE -> TrackDesigner.app bundle
if(WIN32)
    add_executable(TrackDesigner WIN32 ${TD_SOURCES})
elseif(APPLE)
    add_executable(TrackDesigner MACOSX_BUNDLE ${TD_SOURCES})
else()
    add_executable(TrackDesigner ${TD_SOURCES})
endif()

target_include_directories(TrackDesigner PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/../MarklinCommon
)

# -- Link -----------------------------------------------------------------------
if(TARGET wx::core)
    target_link_libraries(TrackDesigner PRIVATE
        MarklinCommon
        wx::core wx::base wx::xml wx::adv wx::gl
        OpenGL::GL OpenGL::GLU
    )
else()
    target_link_libraries(TrackDesigner PRIVATE
        MarklinCommon
        ${wxWidgets_LIBRARIES}
        OpenGL::GL OpenGL::GLU
    )
    target_compile_definitions(TrackDesigner PRIVATE ${wxWidgets_DEFINITIONS})
endif()

# -- macOS bundle: metadata + seed resources ------------------------------------
if(APPLE)
    set_target_properties(TrackDesigner PROPERTIES
        MACOSX_BUNDLE_BUNDLE_NAME           "TrackDesigner"
        MACOSX_BUNDLE_GUI_IDENTIFIER        "com.euromodeltrains.trackdesigner"
        MACOSX_BUNDLE_BUNDLE_VERSION        "1.3.0"
        MACOSX_BUNDLE_SHORT_VERSION_STRING  "1.3"
        MACOSX_BUNDLE_INFO_PLIST            "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in"
    )

    # Shipped content is seeded into the user's writable data dir on first
    # launch (see Paths.cpp / SeedIfNeeded). It is bundled read-only at
    # Contents/Resources/seed:
    #     seed/library/   <- starter library blocks  (from dist/library)
    #     seed/*.tdl      <- sample layouts           (from dist/layouts)
    set(SEED_DIR "$<TARGET_BUNDLE_CONTENT_DIR:TrackDesigner>/Resources/seed")

    add_custom_command(TARGET TrackDesigner POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory "${SEED_DIR}"
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${CMAKE_CURRENT_SOURCE_DIR}/dist/library" "${SEED_DIR}/library"
        COMMENT "Seeding library/ into bundle"
        VERBATIM)

    # Copy every sample layout from dist/layouts into seed/ (flat).
    file(GLOB TD_SAMPLE_LAYOUTS "${CMAKE_CURRENT_SOURCE_DIR}/dist/layouts/*.tdl")
    foreach(layout ${TD_SAMPLE_LAYOUTS})
        add_custom_command(TARGET TrackDesigner POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy "${layout}" "${SEED_DIR}/"
            VERBATIM)
    endforeach()
endif()
