cmake_minimum_required(VERSION 3.14)
project(NeuralNetwork CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

add_executable(neural_network
    main.cpp
    src/Random.cpp
    src/Activation.cpp
    src/Neuron.cpp
    src/Layer.cpp
    src/Loss.cpp
    src/Optimizer.cpp
    src/NeuralNetwork.cpp
    src/Metrics.cpp
)

target_include_directories(neural_network PRIVATE include)

option(BUILD_PYTHON_MODULE "Build the Python bindings (requires pybind11)" ON)

if(BUILD_PYTHON_MODULE)
    execute_process(
        COMMAND python3 -c "import pybind11; print(pybind11.get_cmake_dir())"
        OUTPUT_VARIABLE PYBIND11_CMAKE_DIR
        OUTPUT_STRIP_TRAILING_WHITESPACE
        RESULT_VARIABLE PYBIND11_RESULT
    )
    if(PYBIND11_RESULT EQUAL 0 AND PYBIND11_CMAKE_DIR)
        list(APPEND CMAKE_PREFIX_PATH "${PYBIND11_CMAKE_DIR}")
        find_package(pybind11 CONFIG REQUIRED)

        pybind11_add_module(neuralnetwork._core
            python/bindings.cpp
            src/Random.cpp
            src/Activation.cpp
            src/Neuron.cpp
            src/Layer.cpp
            src/Loss.cpp
            src/Optimizer.cpp
            src/NeuralNetwork.cpp
            src/Metrics.cpp
        )
        target_include_directories(neuralnetwork._core PRIVATE include)
        set_target_properties(neuralnetwork._core PROPERTIES
            OUTPUT_NAME _core
            LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/python/neuralnetwork"
        )
    else()
        message(WARNING "pybind11 not found - skipping Python module build")
    endif()
endif()
