cmake_minimum_required(VERSION 3.10)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(
    ProjectEuler
    LANGUAGES CXX
)

find_package(GTest CONFIG REQUIRED)

file(GLOB LIB_SRCS "common/**.cpp")

add_library(
  common STATIC
    ${LIB_SRCS}
)

target_include_directories(
  common PUBLIC
    common/
)

file(GLOB LIB_TESTS "common-tests/src/**.cpp")

foreach(FILE IN LISTS LIB_TESTS)
  cmake_path(GET FILE STEM TEST)

  add_executable("common-tests-${TEST}" "${FILE}")

  target_link_libraries(
    "common-tests-${TEST}" PRIVATE
        common
        GTest::gtest_main
  )

  set_target_properties(
    "common-tests-${TEST}" PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/common-tests/bin"
        RUNTIME_OUTPUT_NAME "test-${TEST}"
        SUFFIX ""
  )
endforeach()

file(GLOB SOURCES "problem-*/")

foreach(FILE IN LISTS SOURCES)
    cmake_path(GET FILE STEM PROBLEM)

    file(READ "${FILE}/data/input" input)
    file(READ "${FILE}/data/example" example)

    set(TEST_PATH "${CMAKE_CURRENT_BINARY_DIR}/${PROBLEM}/src/test.cpp")
    set(SOLUTION_PATH "${CMAKE_CURRENT_BINARY_DIR}/${PROBLEM}/src/solution.cpp")

    configure_file(
        "${FILE}/src/test.cpp"
        "${TEST_PATH}" ESCAPE_QUOTES
    )
    
    configure_file(
        "${FILE}/src/solution.cpp"
        "${SOLUTION_PATH}" ESCAPE_QUOTES
    )

    add_executable("${PROBLEM}" "${SOLUTION_PATH}")
    add_executable("test-${PROBLEM}" "${TEST_PATH}")
    
    target_link_libraries(
        "${PROBLEM}" PRIVATE
          common
    )

    target_link_libraries(
        "test-${PROBLEM}" PRIVATE
            common
            GTest::gtest_main
    )

    target_include_directories(
        "${PROBLEM}" PRIVATE
            "${FILE}/src"
    )


    target_include_directories(
        "test-${PROBLEM}" PRIVATE
            "${FILE}/src"
    )

    set_target_properties(
        "${PROBLEM}" PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY "${FILE}/bin"
            RUNTIME_OUTPUT_NAME "solution"
            SUFFIX ""
    )
    
    set_target_properties(
        "test-${PROBLEM}" PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY "${FILE}/bin"
            RUNTIME_OUTPUT_NAME "test"
            SUFFIX ""
    )
endforeach()

