# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#.rst:
# Find@PRODUCT_NAME_NOSPACE@
# ---------
#
# Find the @PRODUCT_NAME@ headers and library.
#
# Imported Targets
# ^^^^^^^^^^^^^^^^
#
# This module defines the following :prop_tgt:`IMPORTED` targets:
#
# ``@PRODUCT_NAME_NOSPACE@::cpp``
# ``@PRODUCT_NAME_NOSPACE@:dotnet``
#
# Result Variables
# ^^^^^^^^^^^^^^^^
#
# This module will set the following variables in your project:
#
# ``@PRODUCT_NAME_NOSPACE@_FOUND``
#   true if the @PRODUCT_NAME@ headers and libraries were found.
#
# ``@PRODUCT_NAME_NOSPACE@_DOTNET_LIBRARY``
#   Path to .NET assembly file.
#

set(_@PRODUCT_NAME_NOSPACE@_ROOT "")
if(@PRODUCT_NAME_NOSPACE@_ROOT AND IS_DIRECTORY "${@PRODUCT_NAME_NOSPACE@_ROOT}")
    set(_@PRODUCT_NAME_NOSPACE@_ROOT "${@PRODUCT_NAME_NOSPACE@_ROOT}")
    set(_@PRODUCT_NAME_NOSPACE@_ROOT_EXPLICIT 1)
else()
    set(_ENV_@PRODUCT_NAME_NOSPACE@_ROOT "")
    if(DEFINED ENV{GEODE_NATIVE_HOME})
        file(TO_CMAKE_PATH "$ENV{GEODE_NATIVE_HOME}" _ENV_@PRODUCT_NAME_NOSPACE@_ROOT)
    endif()
    if(_ENV_@PRODUCT_NAME_NOSPACE@_ROOT AND IS_DIRECTORY "${_ENV_@PRODUCT_NAME_NOSPACE@_ROOT}")
        set(_@PRODUCT_NAME_NOSPACE@_ROOT "${_ENV_@PRODUCT_NAME_NOSPACE@_ROOT}")
        set(_@PRODUCT_NAME_NOSPACE@_ROOT_EXPLICIT 0)
    endif()
    unset(_ENV_@PRODUCT_NAME_NOSPACE@_ROOT)
endif()

set(_@PRODUCT_NAME_NOSPACE@_HINTS)
set(_@PRODUCT_NAME_NOSPACE@_PATHS)

if(_@PRODUCT_NAME_NOSPACE@_ROOT)
    set(_@PRODUCT_NAME_NOSPACE@_HINTS ${_@PRODUCT_NAME_NOSPACE@_ROOT})
else()
    set(_@PRODUCT_NAME_NOSPACE@_PATHS (
        "/opt/local"
        "/usr/local"
        "${CMAKE_CURRENT_SOURCE_DIR}/../../../"
        "C:/program files" ))
endif()

# Begin - component "cpp"
set(_@PRODUCT_NAME_NOSPACE@_CPP_NAMES @PRODUCT_LIB_NAME@)

find_library(@PRODUCT_NAME_NOSPACE@_CPP_LIBRARY
    NAMES ${_@PRODUCT_NAME_NOSPACE@_CPP_NAMES}
    HINTS ${_@PRODUCT_NAME_NOSPACE@_HINTS}
    PATHS ${_@PRODUCT_NAME_NOSPACE@_PATHS}
    PATH_SUFFIXES @PRODUCT_LIB_NAME@/lib lib
)

# Look for the header file.
find_path(@PRODUCT_NAME_NOSPACE@_CPP_INCLUDE_DIR NAMES geode/CacheFactory.hpp
    HINTS ${_@PRODUCT_NAME_NOSPACE@_HINTS}
    PATHS ${_@PRODUCT_NAME_NOSPACE@_PATHS}
    PATH_SUFFIXES @PRODUCT_LIB_NAME@/include include
)
# End - component "cpp"

# Begin - component "dotnet"
set(_@PRODUCT_NAME_NOSPACE@_DOTNET_NAMES @PRODUCT_DLL_NAME@.dll)

find_file(@PRODUCT_NAME_NOSPACE@_DOTNET_LIBRARY
  NAMES ${_@PRODUCT_NAME_NOSPACE@_DOTNET_NAMES}
  HINTS ${_@PRODUCT_NAME_NOSPACE@_HINTS}
  PATHS ${_@PRODUCT_NAME_NOSPACE@_PATHS}
  PATH_SUFFIXES @PRODUCT_LIB_NAME@/bin bin
)
# End - component "dotnet"

# TODO find version
set(@PRODUCT_NAME_NOSPACE@_VERSION_STRING 1.0)

if (@PRODUCT_NAME_NOSPACE@_FIND_COMPONENTS)
  set(_@PRODUCT_NAME_NOSPACE@_REQUIRED_VARS)
  foreach (component ${@PRODUCT_NAME_NOSPACE@_FIND_COMPONENTS})
    if (component STREQUAL "cpp")
      list(APPEND _@PRODUCT_NAME_NOSPACE@_REQUIRED_VARS @PRODUCT_NAME_NOSPACE@_CPP_LIBRARY @PRODUCT_NAME_NOSPACE@_CPP_INCLUDE_DIR)
    endif()
    if (component STREQUAL "dotnet")
      list(APPEND _@PRODUCT_NAME_NOSPACE@_REQUIRED_VARS @PRODUCT_NAME_NOSPACE@_DOTNET_LIBRARY)
    endif()
  endforeach()
endif()

include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(@PRODUCT_NAME_NOSPACE@
                                  REQUIRED_VARS ${_@PRODUCT_NAME_NOSPACE@_REQUIRED_VARS}
                                  VERSION_VAR @PRODUCT_NAME_NOSPACE@_VERSION_STRING)

# Copy the results to the output variables and target.
if(@PRODUCT_NAME_NOSPACE@_FOUND)
  if(NOT TARGET ${@PRODUCT_NAME_NOSPACE@_CPP_TARGET})
    set(@PRODUCT_NAME_NOSPACE@_CPP_TARGET "@PRODUCT_NAME_NOSPACE@::cpp")
    add_library(${@PRODUCT_NAME_NOSPACE@_CPP_TARGET} UNKNOWN IMPORTED)
    set_target_properties(${@PRODUCT_NAME_NOSPACE@_CPP_TARGET} PROPERTIES
      IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
      IMPORTED_LOCATION "${@PRODUCT_NAME_NOSPACE@_CPP_LIBRARY}"
      INTERFACE_INCLUDE_DIRECTORIES "${@PRODUCT_NAME_NOSPACE@_CPP_INCLUDE_DIR}")
  endif()
  if(NOT TARGET ${@PRODUCT_NAME_NOSPACE@_DOTNET_TARGET})
    set(@PRODUCT_NAME_NOSPACE@_DOTNET_TARGET "@PRODUCT_NAME_NOSPACE@::dotnet")
    add_library(${@PRODUCT_NAME_NOSPACE@_DOTNET_TARGET} UNKNOWN IMPORTED)
    set_target_properties(${@PRODUCT_NAME_NOSPACE@_DOTNET_TARGET} PROPERTIES
      IMPORTED_LINK_INTERFACE_LANGUAGES "CSharp"
      IMPORTED_LOCATION "${@PRODUCT_NAME_NOSPACE@_DOTNET_LIBRARY}")
  endif()
else()
  message(STATUS "FOUND var not set")
endif()

mark_as_advanced(@PRODUCT_NAME_NOSPACE@_CPP_INCLUDE_DIR @PRODUCT_NAME_NOSPACE@_CPP_LIBRARY @PRODUCT_NAME_NOSPACE@_DOTNET_LIBRARY)
