set(thisDir "${CMAKE_CURRENT_LIST_DIR}")

function(make_macro_name NAME OUT_VAR)
  string(STRIP "${NAME}" name)
  string(TOUPPER "${name}" name)
  string(REPLACE "-" "_" name "${name}")
  string(REGEX REPLACE "(^[0-9]+)|[^A-Z_0-9]" "" name "${name}")
  set(${OUT_VAR} "${name}" PARENT_SCOPE)
endfunction()

function(add_library_project NAME)
  set(options SHARED STATIC)
  set(oneValueArgs)
  set(multiValueArgs SOURCES TEST_SOURCES DEPENDENCIES)
  cmake_parse_arguments(PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

  make_macro_name("${NAME}" macroName)
  set(testDependencies ${PARAM_DEPENDENCIES})
  list(TRANSFORM testDependencies APPEND _Test)

  # static is the default, but we also allow static it explicitly
  set(libType STATIC)
  if (PARAM_SHARED AND PARAM_STATIC)
    message(FATAL_ERROR "Library project ${NAME} can only be SHARED or STATIC, but not both!")
  elseif (PARAM_SHARED)
    set(libType SHARED)
  endif ()

  add_library("${NAME}" ${libType} ${PARAM_SOURCES})
  target_link_libraries("${NAME}" PUBLIC ${PARAM_DEPENDENCIES})
  target_include_directories("${NAME}" PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")

  if (PARAM_SHARED)
    target_compile_definitions("${NAME}" PRIVATE -D${macroName}_BUILD_SHARED)
    target_compile_definitions("${NAME}" INTERFACE -D${macroName}_USE_SHARED)
  endif ()

  add_library("${NAME}_Test" STATIC ${PARAM_TEST_SOURCES})
  target_link_libraries("${NAME}_Test" PUBLIC "${NAME}" gtest gmock ${testDependencies})

  add_executable("${NAME}_Tests" ${PARAM_TEST_SOURCES})
  target_link_libraries("${NAME}_Tests" PRIVATE "${NAME}" gtest gmock gmock_main ${testDependencies})
  add_test(NAME "${NAME}" COMMAND "${NAME}_Tests")
endfunction()

function(add_executable_project)
  # TODO
endfunction()