##  Finds the Stb utility library on your computer.
#
#   If Stb is not found on your computer, this script also gives the option to
#   download the library and build it from source.
#
#   This script exports the following parameters for use if you find the Stb
#   package:
#   - Stb_FOUND: Whether Stb has been found on your computer (or built from
#     source).
#   - Stb_INCLUDE_DIRS: The directory where the header files of Stb are located.

#First try to find a PackageConfig for this library.
find_package(PkgConfig QUIET)
pkg_check_modules(PC_Stb QUIET Stb)

find_path(Stb_INCLUDE_DIRS stb/stb_image_resize.h #Search for something that is a little less prone to false positives than just stb.h.
    HINTS ${PC_Stb_INCLUDEDIR} ${PC_Stb_INCLUDE_DIRS}
    PATHS "$ENV{PROGRAMFILES}" "$ENV{PROGRAMW6432}" "/usr/include"
    PATH_SUFFIXES include/stb stb include
)

include(FindPackageHandleStandardArgs)
set(_stb_find_required ${Stb_FIND_REQUIRED}) #Temporarily set to optional so that we don't get a message when it's not found but you want to build from source.
set(_stb_find_quietly ${Stb_FIND_QUIETLY})
set(Stb_FIND_REQUIRED FALSE)
set(Stb_FIND_QUIETLY TRUE)
find_package_handle_standard_args(Stb DEFAULT_MSG Stb_INCLUDE_DIRS)
set(Stb_FIND_REQUIRED ${_stb_find_required})
set(Stb_FIND_QUIETLY ${_stb_find_quietly})

set(CuraEngine_Download_Stb FALSE)
if(Stb_FOUND) #Found an existing installation.
    if(NOT Stb_FIND_QUIETLY)
        message(STATUS "Found Stb installation at: ${Stb_INCLUDE_DIRS}")
    endif()
else()
    #Then optionally clone Stb ourselves.
    option(BUILD_Stb "Build Stb from source." ON) #This is a lie actually, since Stb is header-only and doesn't need any building. We don't build the docs or tests.
    if(BUILD_Stb)
        if(NOT Stb_FIND_QUIETLY)
            message(STATUS "Building Stb from source.")
        endif()

        include(ExternalProject)
        # Stb's commits in early February seems to cause the engine to fail compilation on Mac.
        ExternalProject_Add(stb
            GIT_REPOSITORY "https://github.com/nothings/stb.git"
            GIT_TAG d5d052c806eee2ca1f858cb58b2f062d9fa25b90
            UPDATE_DISCONNECTED TRUE
            CONFIGURE_COMMAND "" #We don't want to actually go and build/test/generate it. Just need to download the headers.
            BUILD_COMMAND ""
            INSTALL_COMMAND "" #Assume that the user doesn't want to install all dependencies on his system. We just need to get them for building the application.
        )
        set(CuraEngine_Download_Stb TRUE)
        set(Stb_INCLUDE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/stb-prefix/src/stb")
        set(Stb_FOUND TRUE)
        if(NOT Stb_FIND_QUIETLY)
            message(STATUS "Created Stb installation at: ${Stb_INCLUDE_DIRS}")
        endif()
    elseif(NOT Stb_FIND_QUIETLY) #Don't have an installation but don't want us to build it either? Screw you, then.
        if(Stb_FIND_REQUIRED)
            message(FATAL_ERROR "Could NOT find Stb.")
        else()
            message(WARNING "Could NOT find Stb.")
        endif()
    endif()
endif()

mark_as_advanced(Stb_INCLUDE_DIRS)
add_library(stb::stb INTERFACE)
target_include_directories(stb::stb
        PUBLIC
        $<BUILD_INTERFACE:${Stb_INCLUDE_DIRS}>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
        )
