# Copyright (C) 2018 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
# FindIE
# ------
#
#   You can specify the path to Inference Engine files in IE_ROOT_DIR
#
# This will define the following variables:
#
#   InferenceEngine_FOUND        - True if the system has the Inference Engine library
#   InferenceEngine_INCLUDE_DIRS - Inference Engine include directories
#   InferenceEngine_LIBRARIES    - Inference Engine libraries
#
# and the following imported targets:
#
#   IE::inference_engine    - The Inference Engine library
#


set(InferenceEngine_FOUND FALSE)

if(TARGET IE::inference_engine)
    set(InferenceEngine_FOUND TRUE)
    get_target_property(InferenceEngine_INCLUDE_DIRS IE::inference_engine INTERFACE_INCLUDE_DIRECTORIES)
    set(InferenceEngine_LIBRARIES IE::inference_engine)
else()
    if (WIN32)
        set(_ARCH intel64)
    else()
        if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
            set(_ARCH intel64)
        elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386")
            set(_ARCH ia32)
        endif()
    endif()

    # check whether setvars.sh is sourced
    if(NOT IE_ROOT_DIR AND (DEFINED ENV{InferenceEngine_DIR} OR InferenceEngine_DIR OR DEFINED ENV{INTEL_CVSDK_DIR}))
        if (EXISTS "${InferenceEngine_DIR}")
            # InferenceEngine_DIR manually set via command line params
            set(IE_ROOT_DIR "${InferenceEngine_DIR}/..")
        elseif (EXISTS "$ENV{InferenceEngine_DIR}")
            # InferenceEngine_DIR manually set via env
            set(IE_ROOT_DIR "$ENV{InferenceEngine_DIR}/..")
        elseif (EXISTS "$ENV{INTEL_CVSDK_DIR}/inference_engine")
            # if we installed DL SDK
            set(IE_ROOT_DIR "$ENV{INTEL_CVSDK_DIR}/inference_engine")
        elseif (EXISTS "$ENV{INTEL_CVSDK_DIR}/deployment_tools/inference_engine")
            # CV SDK is installed
            set(IE_ROOT_DIR "$ENV{INTEL_CVSDK_DIR}/deployment_tools/inference_engine")
        endif()
    endif()

    if(IE_ROOT_DIR)
        if (WIN32)
            set(_OS_PATH "")
        else()
           if (NOT EXISTS "/etc/lsb-release")
                execute_process(COMMAND find /etc/ -maxdepth 1 -type f -name *-release -exec cat {} \;
                            OUTPUT_VARIABLE release_data RESULT_VARIABLE result)
                set(name_regex "NAME=\"([^ \"\n]*).*\"\n")
                set(version_regex "VERSION=\"([0-9]+(\\.[0-9]+)?)[^\n]*\"")
            else()
                #linux version detection using cat /etc/lsb-release
                file(READ "/etc/lsb-release" release_data)
                set(name_regex "DISTRIB_ID=([^ \n]*)\n")
                set(version_regex "DISTRIB_RELEASE=([0-9]+(\\.[0-9]+)?)")
            endif()

            string(REGEX MATCH ${name_regex} name ${release_data})
            set(os_name ${CMAKE_MATCH_1})

            string(REGEX MATCH ${version_regex} version ${release_data})
            set(os_name "${os_name} ${CMAKE_MATCH_1}")

            if (NOT os_name)
                message(FATAL_ERROR "Cannot detect OS via reading /etc/*-release:\n ${release_data}")
            endif()

            message (STATUS "/etc/*-release distrib: ${os_name}")

            if (${os_name} STREQUAL "Ubuntu 14.04")
                set(_OS_PATH "ubuntu_14.04/")
            elseif (${os_name} STREQUAL "Ubuntu 16.04")
                set(_OS_PATH "ubuntu_16.04/")
            elseif (${os_name} STREQUAL "CentOS 7")
                set(_OS_PATH "centos_7.4/")
            elseif (${os_name} STREQUAL "poky 2.0")
                set(_OS_PATH "ubuntu_16.04/")
            else()
                message(FATAL_ERROR "${os_name} is not supported. List of supported OS: Ubuntu 14.04, Ubuntu 16.04, CentOS 7")
            endif()
        endif()
    endif()

    if(IE_INCLUDE_DIR AND NOT "${IE_ROOT_DIR}/include" EQUAL "${IE_INCLUDE_DIR}")
        unset(IE_INCLUDE_DIR CACHE)
    endif()

    if(IE_LIBRARY AND NOT "${IE_ROOT_DIR}/lib/${_OS_PATH}/${_ARCH}" EQUAL "${IE_LIBRARY}")
        unset(IE_LIBRARY CACHE)
    endif()

    set(_IE_ROOT_INCLUDE_DIR "${IE_ROOT_DIR}/include")
    set(_IE_ROOT_LIBRARY "${IE_ROOT_DIR}/lib/${_OS_PATH}/${_ARCH}")
    

    find_path(IE_INCLUDE_DIR inference_engine.hpp "${_IE_ROOT_INCLUDE_DIR}")
    #message("InferenceEngine_INCLUDE_DIR=${IE_INCLUDE_DIR}:${_IE_ROOT_INCLUDE_DIR}")

    include(FindPackageHandleStandardArgs)
    if (WIN32)
        find_library(IE_RELEASE_LIBRARY inference_engine "${_IE_ROOT_LIBRARY}/Release")
        find_library(IE_DEBUG_LIBRARY inference_engine "${_IE_ROOT_LIBRARY}/Debug")
        find_package_handle_standard_args(  IE
                                            REQUIRED_VARS IE_RELEASE_LIBRARY IE_DEBUG_LIBRARY IE_INCLUDE_DIR
                                            FAIL_MESSAGE "Inference Engine cannot be found at ${_IE_ROOT_LIBRARY}. Please consult InferenceEgnineConfig.cmake module's help page.")
    else()
        find_library(IE_LIBRARY inference_engine "${_IE_ROOT_LIBRARY}")
        find_package_handle_standard_args(  IE
                                            REQUIRED_VARS IE_LIBRARY IE_INCLUDE_DIR
                                            FAIL_MESSAGE "Inference Engine cannot be found at ${_IE_ROOT_LIBRARY}. Please consult InferenceEgnineConfig.cmake module's help page.")
    endif()
    if(IE_FOUND)
        add_library(IE::inference_engine SHARED IMPORTED GLOBAL)

        if (WIN32)
            set_property(TARGET IE::inference_engine APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
            set_property(TARGET IE::inference_engine APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)

            set_target_properties(IE::inference_engine PROPERTIES
                    IMPORTED_IMPLIB_RELEASE    "${IE_RELEASE_LIBRARY}"
                    IMPORTED_IMPLIB_DEBUG      "${IE_DEBUG_LIBRARY}"
                    MAP_IMPORTED_CONFIG_DEBUG Debug
                    MAP_IMPORTED_CONFIG_RELEASE Release
                    MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release
                    INTERFACE_INCLUDE_DIRECTORIES "${IE_INCLUDE_DIR}")
        else()
            set_target_properties(IE::inference_engine PROPERTIES
                    IMPORTED_LOCATION "${IE_LIBRARY}"
                    INTERFACE_INCLUDE_DIRECTORIES "${IE_INCLUDE_DIR}")
            target_link_libraries(IE::inference_engine INTERFACE ${CMAKE_DL_LIBS})
        endif()

        set(InferenceEngine_INCLUDE_DIRS ${IE_INCLUDE_DIR})
        set(InferenceEngine_LIBRARIES IE::inference_engine)
        set(InferenceEngine_FOUND TRUE)
    endif()
endif()