# ── 编译选项接口目标 ──────────────────────────────

# ── foundation ─────────────────────────────────────
add_library(vde_foundation STATIC
    foundation/tolerance.cpp
    foundation/exact_predicates.cpp
    foundation/io_obj.cpp
    foundation/io_stl.cpp
    foundation/serializer.cpp
    foundation/io_ply.cpp
    foundation/io_gltf.cpp
)
target_include_directories(vde_foundation
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_foundation
    PUBLIC  vde_compile_options Eigen3::Eigen
)

# ── core ───────────────────────────────────────────
add_library(vde_core STATIC
    core/polygon.cpp
    core/voronoi.cpp
    core/distance.cpp
    core/convex_hull.cpp
    core/icp.cpp
)
target_include_directories(vde_core
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_core
    PUBLIC  vde_foundation vde_compile_options
)

# ── curves ─────────────────────────────────────────
add_library(vde_curves STATIC
    curves/bezier_curve.cpp
    curves/bspline_curve.cpp
    curves/nurbs_curve.cpp
    curves/bezier_surface.cpp
    curves/bspline_surface.cpp
    curves/tessellation.cpp
)
target_include_directories(vde_curves
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_curves
    PUBLIC  vde_core vde_compile_options
)

# ── mesh ────────────────────────────────────────────
add_library(vde_mesh STATIC
    mesh/halfedge_mesh.cpp
    mesh/delaunay_2d.cpp
    mesh/cdt_2d.cpp
    mesh/delaunay_3d.cpp
    mesh/mesh_simplify.cpp
    mesh/mesh_smooth.cpp
    mesh/mesh_boolean.cpp
    mesh/mesh_quality.cpp
    mesh/mesh_repair.cpp
    mesh/alpha_shapes.cpp
    mesh/mesh_parameterize.cpp
    mesh/geodesic.cpp
    mesh/mesh_curvature.cpp
    mesh/marching_cubes.cpp
)
target_include_directories(vde_mesh
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_mesh
    PUBLIC  vde_core vde_compile_options
)

# ── spatial ─────────────────────────────────────────
add_library(vde_spatial STATIC
    spatial/bvh.cpp
    spatial/octree.cpp
    spatial/kd_tree.cpp
    spatial/r_tree.cpp
)
target_include_directories(vde_spatial
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_spatial
    PUBLIC  vde_core vde_compile_options
)

# ── boolean ─────────────────────────────────────────
add_library(vde_boolean STATIC
    boolean/boolean_2d.cpp
    boolean/boolean_mesh.cpp
    boolean/polygon_offset.cpp
)
target_include_directories(vde_boolean
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_boolean
    PUBLIC  vde_mesh vde_spatial vde_compile_options
)

# ── collision ───────────────────────────────────────
add_library(vde_collision STATIC
    collision/gjk.cpp
    collision/sat.cpp
    collision/ray_intersect.cpp
    collision/tri_intersect.cpp
)
target_include_directories(vde_collision
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_collision
    PUBLIC  vde_core vde_spatial vde_compile_options
)

# ── 聚合库 ──────────────────────────────────────────
add_library(vde INTERFACE)
target_link_libraries(vde
    INTERFACE vde_foundation
    INTERFACE vde_core
    INTERFACE vde_curves
    INTERFACE vde_mesh
    INTERFACE vde_spatial
    INTERFACE vde_boolean
    INTERFACE vde_collision
    INTERFACE vde_brep
    INTERFACE vde_sketch
)
add_library(vde::engine ALIAS vde)

# ── brep ───────────────────────────────────────────
add_library(vde_brep STATIC
    brep/brep.cpp
    brep/modeling.cpp
)
target_include_directories(vde_brep
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_brep
    PUBLIC  vde_curves vde_mesh vde_compile_options
)

# ── sketch ─────────────────────────────────────────
add_library(vde_sketch STATIC
    sketch/constraint_solver.cpp
)
target_include_directories(vde_sketch
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_sketch
    PUBLIC  vde_core vde_compile_options
)

# ── C API ──────────────────────────────────────────
add_library(vde_capi STATIC
    capi/vde_capi.cpp
)
target_include_directories(vde_capi
    PUBLIC  ${CMAKE_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(vde_capi
    PUBLIC  vde_brep vde_sketch vde_collision vde_boolean vde_spatial
    PUBLIC  vde_mesh vde_curves vde_core vde_foundation vde_compile_options
)

# ── GMP exact predicates (optional) ──
if(VDE_USE_GMP)
    list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
    find_package(GMP REQUIRED)
    target_compile_definitions(vde_foundation PUBLIC VDE_USE_GMP)
    target_include_directories(vde_foundation PUBLIC ${GMP_INCLUDE_DIRS})
    target_link_libraries(vde_foundation PUBLIC ${GMP_LIBRARIES})
    message(STATUS "GMP exact arithmetic: ${GMP_INCLUDE_DIRS}")
else()
    message(STATUS "GMP disabled (-DVDE_USE_GMP=ON to enable)")
endif()
