# Copyright (c) 2025 The YAC Authors
#
# SPDX-License-Identifier: BSD-3-Clause

add_library(
  yac_utils
  duplicate_stencils.c
  generate_cubed_sphere.c
  generate_reg2d.c
  grid2vtk.c
  read_cube_csv_grid.c
  read_exodus_grid.c
  read_fesom_grid.c
  read_grid.c
  read_icon_grid.c
  read_mpiom_grid.c
  read_scrip_grid.c
  read_woa_data.c
  test_function.c
  vtk_output.c
)

target_compile_features(yac_utils PRIVATE c_std_99 c_restrict c_variadic_macros)

set_target_properties(yac_utils PROPERTIES POSITION_INDEPENDENT_CODE TRUE)

target_include_directories(
  yac_utils
  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
         $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
         $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

target_link_libraries(
  yac_utils
  PRIVATE MPI::MPI_C
  PUBLIC yac_core
)

# ----------------------------------------------------------------------
# Public header aggregation (yac_utils.h)
# ----------------------------------------------------------------------
set(yac_utils_h_headers
    generate_cubed_sphere.h
    generate_reg2d.h
    grid2vtk.h
    read_cube_csv_grid.h
    test_function.h
    vtk_output.h
    read_grid.h
    read_fesom_grid.h
    read_exodus_grid.h
    read_icon_grid.h
    read_mpiom_grid.h
    read_scrip_grid.h
    read_woa_data.h
    duplicate_stencils.h
)

# Path of the generated aggregated header.
set(YAC_UTILS_H "${CMAKE_CURRENT_BINARY_DIR}/yac_utils.h")

# ----------------------------------------------------------------------
# Generate yac_utils.h using the common script
# ----------------------------------------------------------------------
add_custom_command(
  OUTPUT ${YAC_UTILS_H}
  COMMAND
    ${CMAKE_COMMAND} "-D OUTPUT_FILE=${YAC_UTILS_H}"
    "-D HEADER_FILES=${yac_utils_h_headers}" "-D HEADER_GUARD=YAC_UTILS_H"
    "-D EXTRA_INCLUDES=\#include \"yac_core.h\""
    "-P ${CMAKE_SOURCE_DIR}/cmake/Scripts/generate_yac_public_header.cmake"
  DEPENDS ${yac_utils_h_headers}
  COMMENT "Generating aggregated public header yac_utils.h"
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  VERBATIM
)

# Ensure the header is generated before the yac_utils library is built.
add_custom_target(yac_utils_h ALL DEPENDS ${YAC_UTILS_H})
add_dependencies(yac_utils yac_utils_h)

if(YAC_ENABLE_FORTRAN)
  target_sources(yac_utils PRIVATE yac_utils.F90)
  install(
    FILES ${CMAKE_CURRENT_BINARY_DIR}/yac_utils.mod
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  )
endif()

# Install public headers
install(FILES ${YAC_UTILS_H} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
