# - Try to find libyuv
# Once done this will define
#
#  LIBYUV_FOUND - system has libyuv
#  LIBYUV_INCLUDE_DIR - the libyuv include directory
#  LIBYUV_LIBRARIES - Link these to use libyuv
#
#=============================================================================
#  Copyright (c) 2020 Andreas Schneider <asn@cryptomilk.org>
#
#  Distributed under the OSI-approved BSD License (the "License");
#  see accompanying file Copyright.txt for details.
#
#  This software is distributed WITHOUT ANY WARRANTY; without even the
#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#  See the License for more information.
#=============================================================================
#

find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
    pkg_check_modules(_LIBYUV libyuv)
endif(PKG_CONFIG_FOUND)

if(NOT LIBYUV_INCLUDE_DIR)
    find_path(LIBYUV_INCLUDE_DIR NAMES libyuv.h PATHS ${_LIBYUV_INCLUDEDIR})
endif()

if(LIBYUV_INCLUDE_DIR AND NOT LIBYUV_VERSION)
    set(LIBYUV_VERSION_H "${LIBYUV_INCLUDE_DIR}/libyuv/version.h")
    if(EXISTS ${LIBYUV_VERSION_H})
        # message(STATUS "Reading: ${LIBYUV_VERSION_H}")
        file(READ ${LIBYUV_VERSION_H} LIBYUV_VERSION_H_CONTENTS)
        string(REGEX MATCH "#define LIBYUV_VERSION ([0-9]+)" _ ${LIBYUV_VERSION_H_CONTENTS})
        set(LIBYUV_VERSION ${CMAKE_MATCH_1})
        # message(STATUS "libyuv version detected: ${LIBYUV_VERSION}")
    endif()
    if(NOT LIBYUV_VERSION)
        message(STATUS "libyuv version detection failed.")
    endif()
endif()

if(NOT LIBYUV_LIBRARY)
    find_library(LIBYUV_LIBRARY NAMES yuv PATHS ${_LIBYUV_LIBDIR})
endif()

if(LIBYUV_LIBRARY)
    set(LIBYUV_LIBRARIES ${LIBYUV_LIBRARIES} ${LIBYUV_LIBRARY})
endif(LIBYUV_LIBRARY)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
    libyuv REQUIRED_VARS LIBYUV_LIBRARY LIBYUV_LIBRARIES LIBYUV_INCLUDE_DIR VERSION_VAR _LIBYUV_VERSION
)

# show the LIBYUV_INCLUDE_DIR, LIBYUV_LIBRARY and LIBYUV_LIBRARIES variables only
# in the advanced view
mark_as_advanced(LIBYUV_INCLUDE_DIR LIBYUV_LIBRARY LIBYUV_LIBRARIES)

if(LIBYUV_LIBRARY)
    if("${LIBYUV_LIBRARY}" MATCHES "\\${CMAKE_STATIC_LIBRARY_SUFFIX}$")
        add_library(yuv::yuv STATIC IMPORTED GLOBAL)
    else()
        add_library(yuv::yuv SHARED IMPORTED GLOBAL)
    endif()
    set_target_properties(
        yuv::yuv PROPERTIES IMPORTED_LOCATION "${LIBYUV_LIBRARY}" IMPORTED_IMPLIB "${LIBYUV_LIBRARY}" IMPORTED_SONAME yuv
    )
    target_include_directories(yuv::yuv INTERFACE "${LIBYUV_INCLUDE_DIR}")
    set(libyuv_FOUND ON)
endif()
