cmake_minimum_required(VERSION 3.18)
project(varsculpt LANGUAGES CXX)


# ------------------------------------------------------------
# Configuración general
# ------------------------------------------------------------
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# Build type por defecto
if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()


# ------------------------------------------------------------
# Opciones de optimización (PORTABLE por defecto → PyPI OK)
# ------------------------------------------------------------
option(VARSCULPT_ENABLE_NATIVE "Enable native CPU optimizations (-march=native)" OFF)
option(VARSCULPT_ENABLE_FAST_MATH "Enable fast-math (non-IEEE behavior)" OFF)
option(VARSCULPT_ENABLE_LTO "Enable link-time optimization" OFF)


# Compiler-specific flags. MSVC does not understand GCC/Clang switches.
if(MSVC)
    set(VARSCULPT_CORE_COMPILE_OPTIONS /O2 /W4)
else()
    set(VARSCULPT_CORE_COMPILE_OPTIONS -O3 -fstrict-aliasing -Wall -Wextra -Wpedantic)
endif()

# Añadir flags opcionales
if(VARSCULPT_ENABLE_NATIVE)
    if(MSVC)
        list(APPEND VARSCULPT_CORE_COMPILE_OPTIONS /arch:AVX2)
    else()
        list(APPEND VARSCULPT_CORE_COMPILE_OPTIONS -march=native -mtune=native)
    endif()
endif()

if(VARSCULPT_ENABLE_FAST_MATH)
    if(MSVC)
        list(APPEND VARSCULPT_CORE_COMPILE_OPTIONS /fp:fast)
    else()
        list(APPEND VARSCULPT_CORE_COMPILE_OPTIONS -ffast-math)
    endif()
endif()


# Link-time optimization
if(VARSCULPT_ENABLE_LTO)
    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
endif()


# Mensajes informativos
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "VARSCULPT_ENABLE_NATIVE: ${VARSCULPT_ENABLE_NATIVE}")
message(STATUS "VARSCULPT_ENABLE_FAST_MATH: ${VARSCULPT_ENABLE_FAST_MATH}")
message(STATUS "VARSCULPT_ENABLE_LTO: ${VARSCULPT_ENABLE_LTO}")
message(STATUS "Core compile flags: ${VARSCULPT_CORE_COMPILE_OPTIONS}")


# ------------------------------------------------------------
# Tests (CTest)
# ------------------------------------------------------------
include(CTest)


# ------------------------------------------------------------
# Core C++
# ------------------------------------------------------------
add_subdirectory(src)


# ------------------------------------------------------------
# Python wrapper (scikit-build-core)
# ------------------------------------------------------------
option(BUILD_PYTHON "Build Python bindings" ON)
if(BUILD_PYTHON)
    add_subdirectory(python-package)
endif()


# ------------------------------------------------------------
# Pruebas C++
# ------------------------------------------------------------
if(BUILD_TESTING)
    add_subdirectory(tests)
endif()
