message("== Configuring legacy connector build using cmake generator: ${CMAKE_GENERATOR}")

if(NOT EXISTS "${PROJECT_SOURCE_DIR}/jdbc/CMakeLists.txt")
  message(FATAL_ERROR
    "Could not find JDBC API sources at ${PROJECT_SOURCE_DIR}/jdbc."
    " Have you updated git sub-modules?"
  )
endif()

set(JDBC_DIR "${PROJECT_BINARY_DIR}/jdbc")

if(FORCE_REBUILD AND EXISTS "${JDBC_DIR}/CMakeCache.txt")
  file(REMOVE ${JDBC_DIR}/CMakeCache.txt)
endif()
file(MAKE_DIRECTORY "${JDBC_DIR}")


#############################################################################
#
# Configure legacy connector build environment in ${JDBC_DIR}
#

list(APPEND jdbc_cmake_opts -DMYSQLCLIENT_STATIC_LINKING=ON)

if(CMAKE_BUILD_TYPE)
  list(APPEND jdbc_cmake_opts -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
endif()

if(BUILD_STATIC)
  list(APPEND jdbc_cmake_opts -DENABLE_BUILD_STATIC=ON)
else()
  list(APPEND jdbc_cmake_opts -DENABLE_BUILD_DYNAMIC=ON)
endif()

if(MYSQL_DIR)
  list(APPEND jdbc_cmake_opts -DMYSQL_DIR=${MYSQL_DIR})
endif()

if(DEFINED STATIC_MSVCRT)
  list(APPEND jdbc_cmake_opts -DSTATIC_MSVCRT=${STATIC_MSVCRT})
endif()

if(VS)
  list(APPEND jdbc_cmake_opts -DVS=${VS})
endif()

#
# Find Boost which is required by legacy connector
#

include(boost)
list(APPEND jdbc_cmake_opts -DBOOST_ROOT=${BOOST_ROOT})

#
# Generate version info for legacy connector
#

configure_file(
  "${PROJECT_SOURCE_DIR}/jdbc/VersionInfo.cmake.in"
  "${JDBC_DIR}/VersionInfo.cmake"
  @ONLY
)

# Dirty trick to speed up cmake set up time.

file(
  COPY "${CMAKE_BINARY_DIR}/CMakeFiles/${CMAKE_VERSION}"
  DESTINATION "${JDBC_DIR}/CMakeFiles"
)

if(1)
execute_process(
  COMMAND ${CMAKE_COMMAND} -Wno-dev
          -G "${CMAKE_GENERATOR}"
          ${jdbc_cmake_opts}
          -DCMAKE_INSTALL_PREFIX=${JDBC_DIR}/install
          -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}
          -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
          -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
          ${PROJECT_SOURCE_DIR}/jdbc
  WORKING_DIRECTORY ${JDBC_DIR}
  RESULT_VARIABLE jdbc_config
)
endif()

if(jdbc_config)
  message(FATAL_ERROR "Could not configure legacy connector build: ${jdbc_config}")
endif()


#############################################################################
#
# Target build_jdbc which triggers build and installation of the legacy
# connector.
#

#
#  jdbc.buildstamp
#

set(JDBC_BUILD_STAMP "${PROJECT_BINARY_DIR}/jdbc.buildstamp")
file(REMOVE "${JDBC_BUILD_STAMP}")
#message("JDBC_BUILD_STAMP: ${JDBC_BUILD_STAMP}")

add_custom_command(OUTPUT ${JDBC_BUILD_STAMP}

  COMMAND ${CMAKE_COMMAND} -E remove_directory install
  COMMAND ${CMAKE_COMMAND}
    --build . --target install --config $<CONFIGURATION> --clean-first

  # Move installed headers from include/ to include/jdbc and rename lib/
  # to lib64/ for 64-bit platform

  COMMAND ${CMAKE_COMMAND} -E remove_directory install/jdbc
  COMMAND ${CMAKE_COMMAND} -E rename install/include install/jdbc
  COMMAND ${CMAKE_COMMAND} -E make_directory install/include
  COMMAND ${CMAKE_COMMAND} -E copy_directory install/jdbc install/include/jdbc
  COMMAND ${CMAKE_COMMAND} -E remove_directory install/jdbc

  COMMAND ${CMAKE_COMMAND} -E touch ${JDBC_BUILD_STAMP}

  WORKING_DIRECTORY ${JDBC_DIR}
  COMMENT "Building legacy connector library using configuration: $<CONFIGURATION>"
)

# Collect sources of legacy connector and specify them in the build
# target.

unset(jdbc_sources)
foreach(dir driver cppconn thread)

  file(
    GLOB_RECURSE sources
    #RELATIVE "${PROJECT_SOURCE_DIR}/jdbc/${dir}"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.cpp"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.h"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.cmake"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.cm"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/CMakeLists.txt"
  )

  # TODO: Split into Headers/Sources/Other sub-groups

  source_group(${dir} FILES ${sources})

  list(APPEND jdbc_sources ${sources})

endforeach()

add_custom_target(build_jdbc ALL
  DEPENDS ${JDBC_BUILD_STAMP}
  SOURCES ${jdbc_sources}
)


#############################################################################
#
# Import legacy connector library so that it can be used by other targets.
#

set(JDBC_INCLUDES ${Boost_INCLUDE_DIRS} "${JDBC_DIR}/install/include")
#message("legacy connector includes: ${JDBC_INCLUDES}")

#
# Import library targets exported from the legacy connector project.
#

include("${JDBC_DIR}/exports.cmake")

if(BUILD_STATIC)
  set(JDBC_LIB mysqlcppconn-static)
else()
  set(JDBC_LIB mysqlcppconn)
endif()

add_dependencies(${JDBC_LIB} build_jdbc)

set(JDBC_LIBS ${JDBC_LIB} CACHE INTERNAL "legacy connector library")


#############################################################################
#
# Installation specs for the legacy connector
#

get_target_property(configurations ${JDBC_LIB} IMPORTED_CONFIGURATIONS)

foreach(config ${configurations})

  get_target_property(location ${JDBC_LIB} IMPORTED_LOCATION_${config})
  message("jdbc installing: ${location}")

  if(config STREQUAL DEBUG)
    set(loc "${INSTALL_LIB_DIR}/debug")
    set(loc_static "${INSTALL_LIB_DIR_STATIC}/debug")
  else()
    set(loc "${INSTALL_LIB_DIR}")
    set(loc_static "${INSTALL_LIB_DIR_STATIC}")
  endif()

  if(BUILD_STATIC)

    install(
      FILES ${location}
      CONFIGURATIONS ${config}
      DESTINATION ${loc_static}
    )

  else()

    if(WIN32)

      install(FILES ${location} CONFIGURATIONS ${config} DESTINATION ${loc})

      # install import library for the DLL

      get_target_property(imp_location ${JDBC_LIB} IMPORTED_IMPLIB_${config})

      install(
        FILES ${imp_location}
        CONFIGURATIONS ${config}
        DESTINATION ${loc_static}
      )

    else()

      # We need to install soname and linkname links together with the shared
      # library.

      get_filename_component(name "${location}" NAME)
      get_filename_component(loc_path "${location}" PATH)
      get_target_property(soname ${JDBC_LIB} IMPORTED_SONAME_${config})
      set(linkname "${CMAKE_SHARED_LIBRARY_PREFIX}mysqlcppconn${CMAKE_SHARED_LIBRARY_SUFFIX}")

      #
      # Warning: Using undocumented file(INSTALL ...) signature which creates
      # required symlinks. This command is used in install scripts generated
      # by cmake.
      #

      install(CODE
       "file(INSTALL
          DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${loc}\"
          TYPE SHARED_LIBRARY
          FILES
            \"${location}\"
            \"${loc_path}/${soname}\"
            \"${loc_path}/${linkname}\"
       )"
      )

    endif()

  endif()

endforeach()


install(
  DIRECTORY ${JDBC_DIR}/install/include/jdbc
  DESTINATION ${INSTALL_INCLUDE_DIR}
)


#
#  Install external dependencies of MySQL client library, such as OpenSSL,
#  if bundled with client library installation.
#
#  Note: if main connector uses OpenSSL, then we will use the same libraries
#  to satisfy client library dependency. But if main connector does not use
#  OpenSSL, we copy required dependencies from MySQL installation.
#

if(BUNDLE_DEPENDENCIES AND WITH_SSL STREQUAL "bundled")

  message("Bundling OpenSSL libraries from: ${MYSQL_DIR}")

  install(DIRECTORY "${MYSQL_DIR}/bin/" DESTINATION lib64
    FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}"
  )

endif()

#############################################################################
#
#  Public header checks
#

if(WITH_HEADER_CHECKS)

  # Prepare location where checks will be performed.

  set(CHECK_DIR "${JDBC_DIR}/headers_check")

  file(REMOVE_RECURSE "${CHECK_DIR}")
  file(MAKE_DIRECTORY "${CHECK_DIR}")

  # Dirty trick to speed up cmake set up time.

  file(
    COPY "${CMAKE_BINARY_DIR}/CMakeFiles/${CMAKE_VERSION}"
    DESTINATION "${CHECK_DIR}/CMakeFiles"
  )

  #
  # Target to run header checks.
  #

  ADD_CUSTOM_TARGET(Headers_jdbc
    COMMAND ${CMAKE_COMMAND}
      -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
      -DJDBC_DIR=${JDBC_DIR}
      -DJDBC_INCLUDES="${JDBC_INCLUDES}"
      -DHEADERS_DIR=${PROJECT_SOURCE_DIR}/cdk/cmake/headers
      -DCHECK_DIR=${CHECK_DIR}
      -P ${PROJECT_SOURCE_DIR}/cmake/jdbc_headers_check.cmake
    SOURCES ${all_headers}
  )

  add_dependencies(Headers_jdbc build_jdbc)


  add_test(NAME Headers_jdbc
    COMMAND cmake --build . --target Headers_jdbc
    WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
  )
  message(STATUS "Added JDBC public headers test")

endif()

message("== legacy connector build configured")
