project(sensei-deps)
cmake_minimum_required(VERSION 3.0)

function(append_unique nme val)
  list(FIND ${nme} ${val} idx)
  if(${idx} LESS 0)
    set(${nme} ${${nme}} ${val} PARENT_SCOPE)
  endif()
endfunction()

function(append_unique_loc lname tgt)
  set(tmp ${${lname}})
  if(TARGET ${tgt})
    get_target_property(tgt_type ${tgt} TYPE)
    if(NOT ("${tgt_type}" STREQUAL "INTERFACE_LIBRARY"))
      get_target_property(loc ${tgt} LOCATION)
      append_unique(tmp ${loc})
    endif()
  else()
    append_unique(tmp ${tgt})
  endif()
  set(${lname} ${tmp} PARENT_SCOPE)
endfunction()

function(append_unique_iid lname tgt)
  get_target_property(tgt_type ${tgt} TYPE)
  if("${tgt_type}" STREQUAL "INTERFACE_LIBRARY")
    get_target_property(tgt_iid ${tgt} INTERFACE_INCLUDE_DIRECTORIES)
    if(tgt_iid)
      set(tmp ${${lname}})
      foreach(pot_inc ${tgt_iid})
        append_unique(tmp ${pot_inc})
      endforeach()
      set(${lname} ${tmp} PARENT_SCOPE)
    endif()
  endif()
endfunction()

function(get_deps tgt deps incs)
  set(tmp_deps)
  set(tmp_incs)
  if(TARGET ${tgt})
    append_unique_iid(tmp_incs ${tgt})
    append_unique_loc(tmp_deps ${tgt})
  endif()
  get_target_property(pot_deps ${tgt} INTERFACE_LINK_LIBRARIES)
  foreach(pot_dep ${pot_deps})
    if(pot_dep)
      if(TARGET ${pot_dep})
        set(tmp_deps_ll)
        set(tmp_incs_ll)
        get_deps(${pot_dep} tmp_deps_ll tmp_incs_ll)
        foreach(tmp_dep_ll ${tmp_deps_ll})
          append_unique_loc(tmp_deps ${tmp_dep_ll})
        endforeach()
        foreach(tmp_inc_ll ${tmp_incs_ll})
          append_unique(tmp_incs ${tmp_inc_ll})
        endforeach()
      else()
        append_unique(tmp_deps ${pot_dep})
      endif()
    endif()
  endforeach()
  set(${deps} ${${deps}} ${tmp_deps} PARENT_SCOPE)
  set(${incs} ${${incs}} ${tmp_incs} PARENT_SCOPE)
endfunction()



find_package(SENSEI REQUIRED)

if (NOT SENSEI_LIBRARIES)
  get_deps(sensei sensei_deps sensei_incs)

  string(GENEX_STRIP "${sensei_deps}" sensei_deps)
  string(REGEX REPLACE "([^;]+);" "\\1:" sensei_deps "${sensei_deps}")
  string(REPLACE " " ":" sensei_deps "${sensei_deps}")
  set(SENSEI_LIBRARIES ${sensei_deps} CACHE STRING "SENSEI link dependencies")

  string(REGEX REPLACE "([^;]+);" "\\1:" sensei_incs "${sensei_incs}")
  set(SENSEI_INCLUDES ${sensei_incs} CACHE STRING "SENSEI include directiories")
endif()

configure_file(sensei_config.in sensei_config @ONLY)

install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/sensei_config
    DESTINATION bin)
