cmake_minimum_required(VERSION 3.16)
project(help_core)

set(CMAKE_CXX_STANDARD 20)

# get CPM
set(CPM_DOWNLOAD_VERSION 0.34.0)

if(CPM_SOURCE_CACHE)
    set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
    set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
else()
    set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
endif()

if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
    message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
    file(DOWNLOAD
            https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
            ${CPM_DOWNLOAD_LOCATION}
            )
endif()

include(${CPM_DOWNLOAD_LOCATION})

# get Magic Enum

CPMAddPackage(
        NAME magic_enum
        GITHUB_REPOSITORY Neargye/magic_enum
        GIT_TAG v0.8.2
)

# find Boost //TODO: I am not sure if we really need this at all
find_package(Boost COMPONENTS program_options REQUIRED)
if (Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_definitions( "-DHAS_BOOST" )
endif()

add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)

add_executable(help_core
    src/main.cpp

        src/utils/type_defs.h
        src/task_formulations/lifted_strips_task.h
        src/task_formulations/lifted_strips_task.cpp

        src/input_handling/input_handler.h
        src/input_handling/input_handler.cpp

        src/input_handling/parser/parser.h
        src/input_handling/parser/parser.tpp

        src/input_handling/lexer/token.h
        src/input_handling/lexer/token.cpp
        src/input_handling/lexer/lexer.h
        src/input_handling/lexer/lexer.cpp

        src/input_handling/parser/parser.h
        src/input_handling/parser/parser.tpp

        src/input_handling/parser/argparser/arg_parser.h
        src/input_handling/parser/argparser/arg_parser.cpp

        src/input_handling/parser/datalog/datalog_parser.h
        src/input_handling/parser/datalog/datalog_parser.cpp

    src/logging/logger.h

    src/cmd_opts/lex.h
    src/cmd_opts/cmd_opt.h
    src/cmd_opts/cmd_opt.cpp

        src/input_handling/parser/datalog/datalog_parser.h
        src/input_handling/parser/datalog/datalog_parser.cpp

    src/conj_query_eval/join_and_project.cpp
    src/conj_query_eval/join_and_project.h

    src/conj_query_eval/table_representation/table.cpp
    src/conj_query_eval/table_representation/table.h

    src/conj_query_eval/join_order_generator/criterion_join_list.h
        src/conj_query_eval/join_order_generator/join_by_criterion.tpp
    src/conj_query_eval/join_order_generator/join_by_criterion.h
    src/conj_query_eval/join_order_generator/join_order_generator.cpp
    src/conj_query_eval/join_order_generator/join_order_generator.h

        src/conj_query_eval/join_order_generator/join_criteria/random.tpp
        src/conj_query_eval/join_order_generator/join_criteria/random.h
        src/conj_query_eval/join_order_generator/join_criteria/yannakakis.tpp
        src/conj_query_eval/join_order_generator/join_criteria/yannakakis.h

    src/conj_query_eval/join_realizer/init_nodes.h
    src/conj_query_eval/join_realizer/init_nodes.cpp
    src/conj_query_eval/join_realizer/nodes.cpp
    src/conj_query_eval/join_realizer/nodes.h
    src/conj_query_eval/join_realizer/join_order_graph.h
    src/conj_query_eval/join_realizer/join_order_graph.cpp

    src/conj_query_eval/table_representation/table_cache.h
    src/conj_query_eval/table_representation/table_cache.cpp
    src/conj_query_eval/table_representation/table.h
    src/conj_query_eval/table_representation/table.cpp

        src/utils/hashes.h

        src/conj_query_eval/query_sort.h src/conj_query_eval/join_realizer/join_order_graph.tpp src/heuristics/heuristic.h src/heuristics/regr_add.cpp src/conj_query_eval/join_realizer/start_node_manager.h src/conj_query_eval/join_realizer/start_node_manager.tpp src/utils/primitive_type_wrapper.hpp)

# link dependencies
target_link_libraries(help_core magic_enum)
target_link_libraries(help_core ${Boost_LIBRARIES})

#TODO: cleanup this file
#TODO: optimizations