# - Config file for the Libevent package
# It defines the following variables
#  LIBEVENT_FOUND            - true if libevent and all required components found on the system
#  LIBEVENT_xxx_FOUND        - true if component xxx(see available components) found on the system
#  LIBEVENT_VERSION          - libevent version in format Major.Minor.Patch
#  LIBEVENT_INCLUDE_DIRS     - directories where libevent header is located.
#  LIBEVENT_INCLUDE_DIR      - same as DIRS
#  LIBEVENT_LIBRARIES        - libevent library to link against.
#  LIBEVENT_LIBRARY          - same as LIBRARIES
#
# These variables are deprecated, don't use them.
#  LIBEVENT_STATIC_LIBRARIES - libraries to link against (archive/static)
#  LIBEVENT_SHARED_LIBRARIES - libraries to link against (shared)
#
# When you try to locate the libevent libraries, you should specify which components you want to use.
# The following table lists all available components. If none is given, all imported targets will used.
#  core        - the core functons of libevent
#  extra       - extra functions, contains http, dns and rpc
#  pthreads    - multiple threads for libevent, not exists on Windows
#  openssl     - openssl support for libevent
#
# By default, the shared libraries of libevent will be found. To find the static ones instead,
# you must set the LIBEVENT_STATIC_LINK variable to TRUE before calling find_package(Libevent ...).
# If no component provided, all components will be used.
# example:
#  set(LIBEVENT_STATIC_LINK TRUE)
#  find_package(Libevent 2.2 REQUIRED COMPONENTS core)
#  include_directories(${LIBEVENT_INCLUDE_DIRS})  # Can be omitted
#  target_link_libraries(myapp ${LIBEVENT_LIBRARIES})
#    or target_link_libraries(myapp libevent::core)
#
# find_package() can handle dependencies automatically. For example, given the 'openssl' component,
# all dependencies (libevent_core, libssl, libcrypto and openssl include directories) will be found.

set(CONFIG_FOR_INSTALL_TREE @CONFIG_FOR_INSTALL_TREE@)

set(LIBEVENT_VERSION @EVENT_PACKAGE_VERSION@)

# IMPORTED targets from LibeventTargets.cmake
set(LIBEVENT_STATIC_LIBRARIES "@LIBEVENT_STATIC_LIBRARIES@")
set(LIBEVENT_SHARED_LIBRARIES "@LIBEVENT_SHARED_LIBRARIES@")

# Default to the same type as libevent was built:
if(NOT DEFINED LIBEVENT_STATIC_LINK)
   set(LIBEVENT_STATIC_LINK NOT @EVENT_LIBRARY_SHARED@)
endif()

set(CMAKE_FIND_LIBRARY_SUFFIXES_SAVE "${CMAKE_FIND_LIBRARY_SUFFIXES}")
if(${LIBEVENT_STATIC_LINK})
   set(_LIB_TYPE static)
   set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
   set(_AVAILABLE_LIBS "${LIBEVENT_STATIC_LIBRARIES}")
else()
   set(_LIB_TYPE shared)
   set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
   set(_AVAILABLE_LIBS "${LIBEVENT_SHARED_LIBRARIES}")
endif()

# Get the path of the current file.
get_filename_component(LIBEVENT_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_INSTALL_PREFIX "${LIBEVENT_CMAKE_DIR}/../../.." ABSOLUTE)

macro(message_if_needed _flag _msg)
   if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
       message(${_flag} "${_msg}")
   endif()
endmacro()

macro(no_component_msg _comp)
   if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED_${_comp})
       set(pthreadlib)
       if(NOT WIN32)
           set(pthreadlib ", pthreads")
       endif()
       message(FATAL_ERROR "Your libevent library does not contain a ${_comp} component!\n"
               "The valid components are core, extra${pthreadlib} and openssl.")
   else()
       message_if_needed(WARNING "Your libevent library does not contain a ${_comp} component!")
   endif()
endmacro()

set(_EVENT_COMPONENTS)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
   list(REMOVE_DUPLICATES ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
   foreach(_comp ${${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS})
       list(FIND _AVAILABLE_LIBS ${_comp} _INDEX)
       if(_INDEX GREATER -1)
           list(APPEND _EVENT_COMPONENTS ${_comp})
       else()
           no_component_msg(${_comp})
       endif()
   endforeach()
else()
   set(_EVENT_COMPONENTS ${_AVAILABLE_LIBS})
endif()

set(_POSSIBLE_PKG_NAMES)
list(APPEND _POSSIBLE_PKG_NAMES ${CMAKE_FIND_PACKAGE_NAME} LIBEVENT Libevent libevent)
list(REMOVE_DUPLICATES _POSSIBLE_PKG_NAMES)

macro(set_case_insensitive_found _comp)
   foreach(name ${_POSSIBLE_PKG_NAMES})
       if("${_comp}" STREQUAL "")
           set(${name}_FOUND TRUE)
           set(${name}_NOTFOUND FALSE)
       else()
           set(${name}_${_comp}_FOUND TRUE)
           set(${name}_${_comp}_NOTFOUND FALSE)
       endif()
   endforeach()
endmacro()

if(CONFIG_FOR_INSTALL_TREE)
   ## Config for install tree ----------------------------------------
   # Find includes
   unset(_event_h CACHE)
   find_path(_event_h
             NAMES event2/event.h
             PATHS "${_INSTALL_PREFIX}/include"
             NO_DEFAULT_PATH)
   if(_event_h)
       set(LIBEVENT_INCLUDE_DIRS "${_event_h}")
       message_if_needed(STATUS "Found libevent include directory: ${_event_h}")
   else()
       message_if_needed(WARNING "Your libevent library does not contain header files!")
   endif()

   # Find libraries
   macro(find_event_lib _comp)
       unset(_event_lib CACHE)
       find_library(_event_lib
                   NAMES "event_${_comp}"
                   PATHS "${_INSTALL_PREFIX}/lib"
                   NO_DEFAULT_PATH)
       if(_event_lib)
           list(APPEND LIBEVENT_LIBRARIES "libevent::${_comp}")
           set_case_insensitive_found(${_comp})
           message_if_needed(STATUS "Found libevent component: ${_event_lib}")
       else()
           no_component_msg(${_comp})
       endif()
   endmacro()

   foreach(comp ${_EVENT_COMPONENTS})
       find_event_lib(${comp})
   endforeach()
else()
   ## Config for build tree ----------------------------------------
   set(LIBEVENT_INCLUDE_DIRS "@EVENT__INCLUDE_DIRS@")
   foreach(_comp ${_EVENT_COMPONENTS})
       list(APPEND LIBEVENT_LIBRARIES "libevent::${_comp}")
       set_case_insensitive_found(${_comp})
   endforeach()
endif()

set(LIBEVENT_INCLUDE_DIR ${LIBEVENT_INCLUDE_DIRS})
if(LIBEVENT_LIBRARIES)
   set(LIBEVENT_LIBRARY ${LIBEVENT_LIBRARIES})
   if(CONFIG_FOR_INSTALL_TREE)
       message_if_needed(STATUS "Found libevent ${LIBEVENT_VERSION} in ${_INSTALL_PREFIX}")
   else()
       message_if_needed(STATUS "Found libevent ${LIBEVENT_VERSION} in ${LIBEVENT_CMAKE_DIR}")
   endif()

   # Avoid including targets more than one times
   if(NOT TARGET event_core_${_LIB_TYPE})
       # Include the project Targets file, this contains definitions for IMPORTED targets.
       include(${LIBEVENT_CMAKE_DIR}/LibeventTargets-${_LIB_TYPE}.cmake)
   endif()
else()
   if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
       message(FATAL_ERROR "Can not find any libraries for libevent.")
   else()
       message_if_needed(WARNING "Can not find any libraries for libevent.")
   endif()
endif()

set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES_SAVE}")
unset(_LIB_TYPE)
unset(_AVAILABLE_LIBS)
unset(_EVENT_COMPONENTS)
unset(_POSSIBLE_PKG_NAMES)
unset(_INSTALL_PREFIX)