#  Copyright (C) GridGain Systems. All Rights Reserved.
#  _________        _____ __________________        _____
#  __  ____/___________(_)______  /__  ____/______ ____(_)_______
#  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
#  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
#  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/

set(TARGET ${PROJECT_NAME}-odbc)

set(PUBLIC_HEADERS)

set(PRIVATE_HEADERS
    app/application_data_buffer.h
    app/parameter.h
    app/parameter_set.h
    common_types.h
    config/config_tools.h
    config/configuration.h
    config/connection_info.h
    config/value_with_default.h
    diagnostic/diagnosable.h
    diagnostic/diagnosable_adapter.h
    diagnostic/diagnostic_record.h
    diagnostic/diagnostic_record_storage.h
    log.h
    meta/primary_key_meta.h
    meta/table_meta.h
    odbc.h
    odbc_error.h
    query/column_metadata_query.h
    query/cursor.h
    query/data_query.h
    query/foreign_keys_query.h
    query/primary_keys_query.h
    query/query.h
    query/result_page.h
    query/special_columns_query.h
    query/table_metadata_query.h
    query/type_info_query.h
    sql_connection.h
    sql_environment.h
    sql_statement.h
    ssl_mode.h
    system/odbc_constants.h
    type_traits.h
    utility.h
)

ignite_check_headers(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC ${PUBLIC_HEADERS} PRIVATE ${PRIVATE_HEADERS})

ignite_collect_public_headers(odbc PUBLIC_HEADERS)

include(find_odbc)
find_package(ODBC REQUIRED)

set(SOURCES
    app/application_data_buffer.cpp
    app/parameter.cpp
    app/parameter_set.cpp
    common_types.cpp
    config/config_tools.cpp
    config/configuration.cpp
    config/connection_info.cpp
    diagnostic/diagnosable_adapter.cpp
    diagnostic/diagnostic_record.cpp
    diagnostic/diagnostic_record_storage.cpp
    meta/table_meta.cpp
    query/column_metadata_query.cpp
    query/data_query.cpp
    query/foreign_keys_query.cpp
    query/primary_keys_query.cpp
    query/special_columns_query.cpp
    query/table_metadata_query.cpp
    query/type_info_query.cpp
    odbc.cpp
    entry_points.cpp
    ssl_mode.cpp
    sql_connection.cpp
    sql_environment.cpp
    sql_statement.cpp
    type_traits.cpp
    utility.cpp
    log.cpp
)

set(EXTRA_FILES)

if (WIN32)
    string(REPLACE "." "," IGNITE_VERSION_4_COMMAS ${IGNITE_VERSION_4})
    configure_file(${IGNITE_CMAKE_TOP_DIR}/ignite/odbc/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc @ONLY)
    set(EXTRA_FILES ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
endif()

add_compile_definitions(CMAKE_PROJECT_VERSION="${IGNITE_VERSION_3}")

add_library(${TARGET}-obj OBJECT ${SOURCES})
target_include_directories(${TARGET}-obj PUBLIC ${IGNITE_CMAKE_TOP_DIR} ${ODBC_INCLUDE_DIRS})

add_library(${TARGET} SHARED $<TARGET_OBJECTS:${TARGET}-obj> module.def ${EXTRA_FILES})
set_target_properties(${TARGET} PROPERTIES EXPORT_NAME odbc)

set(LIBRARIES
    gridgain-common
    gridgain-tuple
    gridgain-network
    gridgain-protocol
    ${ODBC_LIBRARIES}
)

set(_target_libs ${TARGET} ${TARGET}-obj)

foreach(_target_lib IN LISTS _target_libs)
    set_target_properties(${_target_lib} PROPERTIES VERSION ${IGNITE_VERSION_3})
    set_target_properties(${_target_lib} PROPERTIES POSITION_INDEPENDENT_CODE 1)

    if (WIN32)
        list(APPEND LIBRARIES odbccp32 shlwapi)

        remove_definitions(-DUNICODE=1)

        if (MSVC_VERSION GREATER_EQUAL 1900)
            list(APPEND LIBRARIES legacy_stdio_definitions)
        endif()
    elseif(NOT APPLE)
        list(APPEND LIBRARIES odbcinst)
    endif()

    target_include_directories(${_target_lib} SYSTEM INTERFACE ${ODBC_INCLUDE_DIRS})
    target_include_directories(${_target_lib}
        INTERFACE $<BUILD_INTERFACE:${IGNITE_CMAKE_TOP_DIR}/>
                  $<INSTALL_INTERFACE:${IGNITE_INSTALL_INCLUDE_DIR}/>
    )
    target_link_libraries(${_target_lib} PRIVATE ${LIBRARIES})
endforeach()
unset(_target_libs)

add_library(gridgain::odbc ALIAS ${TARGET})

install(TARGETS ${TARGET}
    EXPORT gridgain-odbc-targets
    COMPONENT odbc
    ARCHIVE DESTINATION ${IGNITE_INSTALL_ARCHIVE_DIR}
    LIBRARY DESTINATION ${IGNITE_INSTALL_LIBRARY_DIR}
    RUNTIME DESTINATION ${IGNITE_INSTALL_RUNTIME_DIR}
    INCLUDES DESTINATION ${IGNITE_INSTALL_INCLUDE_DIR}
)

export(
    EXPORT gridgain-odbc-targets
    NAMESPACE gridgain::
    FILE "cmake/gridgain-odbc-targets.cmake"
)

install(
    EXPORT gridgain-odbc-targets
    NAMESPACE gridgain::
    DESTINATION "${IGNITE_INSTALL_LIBRARY_DIR}/cmake/gridgain"
    COMPONENT odbc-local
    FILE "gridgain-odbc-targets.cmake"
)

ignite_test(connection_info_test DISCOVER SOURCES config/connection_info_test.cpp LIBS ${TARGET}-obj ${LIBRARIES})
ignite_test(config_tools_test DISCOVER SOURCES config/config_tools_test.cpp LIBS ${TARGET}-obj ${LIBRARIES})
ignite_test(application_data_buffer_test DISCOVER SOURCES app/application_data_buffer_test.cpp LIBS ${TARGET}-obj ${LIBRARIES})
