cmake_minimum_required(VERSION 3.16)

project(FnixLib
    VERSION 0.1.0
    DESCRIPTION "Biblioteca multimedia propia para juegos y aplicaciones 2D/3D"
    LANGUAGES C)

# La versión 0.1.0 solo tiene implementación para Linux (X11).
if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
    message(FATAL_ERROR
        "FnixLib ${PROJECT_VERSION} solo está implementada para Linux (X11). "
        "El soporte de Windows todavía no existe.")
endif()

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Tipo de compilación" FORCE)
endif()

set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

option(FNIX_BUILD_EXAMPLES "Compilar los ejemplos" ON)
option(FNIX_BUILD_TESTS "Compilar las pruebas (ctest)" ON)
option(FNIX_WARNINGS_AS_ERRORS "Tratar las advertencias como errores" OFF)
option(FNIX_SANITIZE "Compilar con AddressSanitizer y UBSan" OFF)

if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
    add_compile_options(-Wall -Wextra -Wpedantic -Wshadow)
    if(FNIX_WARNINGS_AS_ERRORS)
        add_compile_options(-Werror)
    endif()
    if(FNIX_SANITIZE)
        add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer
                            -fno-sanitize-recover=undefined)
        add_link_options(-fsanitize=address,undefined)
    endif()
endif()

# Única dependencia del sistema: Xlib (libX11).
find_package(X11 REQUIRED)

add_library(fnix
    src/core/errors.c
    src/core/window.c
    src/graphics/canvas.c
    src/graphics/draw2d.c
    src/input/input.c
    src/time/time.c
    src/platform/linux/x11_keys.c
    src/platform/linux/x11_window.c)
add_library(FnixLib::fnix ALIAS fnix)

target_include_directories(fnix
    PUBLIC  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(fnix PRIVATE X11::X11)

if(FNIX_BUILD_EXAMPLES)
    add_executable(basic examples/basic/main.c)
    target_link_libraries(basic PRIVATE fnix)
endif()

if(FNIX_BUILD_TESTS)
    enable_testing()

    foreach(test_name core draw2d input)
        add_executable(test_${test_name} tests/test_${test_name}.c)
        target_link_libraries(test_${test_name} PRIVATE fnix)
        add_test(NAME ${test_name} COMMAND test_${test_name})
    endforeach()
    # test_input comprueba la lógica interna, así que usa cabeceras privadas.
    target_include_directories(test_input PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)

    # Necesita un servidor X11; sin DISPLAY termina con el código 77 (omitida).
    add_executable(test_window_x11 tests/test_window_x11.c)
    target_link_libraries(test_window_x11 PRIVATE fnix X11::X11)
    add_test(NAME window_x11 COMMAND test_window_x11)
    set_tests_properties(window_x11 PROPERTIES SKIP_RETURN_CODE 77)
endif()
