include(soci_define_backend_target)

if (SOCI_SQLITE3_AUTO)
  # Unlike most other backends, we can fall back on using the built-in
  # version of SQLite3 if the system version is not found.
  set(DEPENDENCY_MODE "BUILTIN")
else()
  set(DEPENDENCY_MODE "ERROR")
endif()

# This variable is specific to this backend and allows to either force or
# disable using the built-in copy of SQLite3.
set(SOCI_SQLITE3_BUILTIN "" CACHE STRING "Prefer, or forbid, using the built-in SQLite3 library")

set(SQLITE_TARGET "SQLite3::SQLite3")
if (CMAKE_VERSION VERSION_LESS 4.3)
  # CMake 4.3 changed the name of the SQLite target. For older CMake versions,
  # we'll stick to the old name.
  set(SQLITE_TARGET "SQLite::SQLite3")
endif()

soci_define_backend_target(
  NAME "SQLite3"
  TARGET_NAME "soci_sqlite3"
  DEPENDENCIES
    "SQLite3 YIELDS ${SQLITE_TARGET}"
  SOURCE_FILES
    "blob.cpp"
    "error.cpp"
    "factory.cpp"
    "row-id.cpp"
    "session.cpp"
    "standard-into-type.cpp"
    "standard-use-type.cpp"
    "statement.cpp"
    "vector-into-type.cpp"
    "vector-use-type.cpp"
  HEADER_FILES
    "${PROJECT_SOURCE_DIR}/include/soci/sqlite3/soci-sqlite3.h"
  MISSING_DEPENDENCY_BEHAVIOR "${DEPENDENCY_MODE}"
)

if (NOT SOCI_SQLITE3)
  return()
endif()

# If SQLite3 was found, this target must have been created.
if (NOT TARGET ${SQLITE_TARGET})
  set(SOCI_SQLITE3_DIRECTORY "${PROJECT_SOURCE_DIR}/3rdparty/sqlite3" CACHE
    STRING "Directory where the built-in SQLite3 source code is located"
  )
  set(SOCI_SQLITE3_SOURCE_FILE "${SOCI_SQLITE3_DIRECTORY}/sqlite3.c" CACHE
    STRING "Source file for the built-in SQLite3 library"
  )

  # But if it wasn't, use our built-in version, after checking that it is
  # available, and if we're allowed to use it.
  if (NOT "${SOCI_SQLITE3_BUILTIN}" STREQUAL "OFF")
    if (NOT EXISTS ${SOCI_SQLITE3_SOURCE_FILE})
      message(
        FATAL_ERROR
        "SQLite3 not found and built-in version not available. Please ensure "
"that you have cloned the SOCI repository with --recurse-submodules."
      )
    else()
      set(SOCI_SQLITE3_USE_BUILTIN ON)
    endif()
  endif()

  if (NOT SOCI_SQLITE3_USE_BUILTIN)
    get_property(DESCRIPTION CACHE SOCI_SQLITE3 PROPERTY HELPSTRING)
    set(SOCI_SQLITE3 OFF CACHE STRING "${DESCRIPTION}" FORCE)
    return()
  endif()

  if ("${SOCI_SQLITE3_BUILTIN}" STREQUAL "ON")
    set(SOCI_SQLITE3_BUILTIN_MESSAGE_NOW
      "Using built-in version of SQLite3 in ${SOCI_SQLITE3_SOURCE_FILE}"
    )
  else()
    set(SOCI_SQLITE3_BUILTIN_MESSAGE_NOW
      "Falling back on built-in version of SQLite3"
    )
  endif()

  if(NOT "${SOCI_SQLITE3_BUILTIN_MESSAGE}" STREQUAL "${SOCI_SQLITE3_BUILTIN_MESSAGE_NOW}")
    set(SOCI_SQLITE3_BUILTIN_MESSAGE ${SOCI_SQLITE3_BUILTIN_MESSAGE_NOW}
      CACHE INTERNAL
      "SOCI internal message shown when using the built-in SQLite3 library"
    )
    message(STATUS "${SOCI_SQLITE3_BUILTIN_MESSAGE}")
  endif()

  target_sources(soci_sqlite3
    PRIVATE
      ${SOCI_SQLITE3_SOURCE_FILE}
  )
  target_include_directories(soci_sqlite3
    PRIVATE
      ${SOCI_SQLITE3_DIRECTORY}
  )
endif()
