#
# Tencent is pleased to support the open source community by making
# FlexUI available.
#
# Copyright (C) 2022 THL A29 Limited, a Tencent company.
# All rights reserved.
#
# Licensed 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.
#

cmake_minimum_required(VERSION 3.14)

include(FetchContent)

if (NOT DEFINED INFA_PACKAGES_URL)
  if (DEFINED ENV{CMAKE_INFA_PACKAGES_URL})
    set(INFA_PACKAGES_URL "$ENV{CMAKE_INFA_PACKAGES_URL}")
  else()
    set(INFA_PACKAGES_URL "https://infra-packages.openhippy.com")
  endif()
endif ()
if (NOT DEFINED DEFAULT_INFA_DOMAIN)
  set(DEFAULT_INFA_DOMAIN "hippy")
endif ()

macro(InfraPackage_Add packageName)
  string(TOLOWER ${ARGV0} packageNameLower)
  if ("${packageNameLower}" STREQUAL "")
    message(FATAL_ERROR "Empty packageName not allowed for InfaPackage_Add()")
  endif ()

  set(requiredValueArgs REMOTE LOCAL)
  set(optionalValueArgs REMOTE_HASH REMOTE_DOMAIN)

  set(options "")
  set(oneValueArgs ${requiredValueArgs} ${optionalValueArgs})
  set(multiValueArgs "")
  set(list_var "${ARGN}")
  cmake_parse_arguments(ARG
      "${options}" "${oneValueArgs}" "${multiValueArgs}" ${list_var})

  set(__return NO)
  if (ARG_LOCAL)
    set(ABSOLUTE_LOCAL_PATH "${ARG_LOCAL}")
    if (NOT IS_ABSOLUTE "${ABSOLUTE_LOCAL_PATH}")
      get_filename_component(ABSOLUTE_LOCAL_PATH "${ABSOLUTE_LOCAL_PATH}" ABSOLUTE)
    endif ()
    if (EXISTS "${ABSOLUTE_LOCAL_PATH}")
      # Pass variables back to the caller.
      set(${packageNameLower}_SOURCE_DIR ${ABSOLUTE_LOCAL_PATH})
      set(${packageNameLower}_BINARY_DIR "${CMAKE_BINARY_DIR}/infa_packages/${packageNameLower}")
      set(${contentNameLower}_POPULATED True)

      if (EXISTS "${ABSOLUTE_LOCAL_PATH}/CMakeLists.txt")
        add_subdirectory(${ABSOLUTE_LOCAL_PATH} ${${packageNameLower}_BINARY_DIR})
      endif ()
      set(__return YES)
    endif ()
  endif ()

  if (ARG_REMOTE AND NOT __return)
    if (NOT ARG_REMOTE_DOMAIN)
      set(ARG_REMOTE_DOMAIN ${DEFAULT_INFA_DOMAIN})
    endif ()

    # Prepare FetchContent_Declare() ARG
    set(FetchContent_Declare_ARG ${packageNameLower}
        URL "${INFA_PACKAGES_URL}/${ARG_REMOTE_DOMAIN}/${ARG_REMOTE}")
    if (ARG_REMOTE_HASH)
      list(APPEND FetchContent_Declare_ARG URL_HASH ${ARG_REMOTE_HASH})
    endif ()

    cmake_policy(PUSH)
    if (POLICY CMP0135)
      cmake_policy(SET CMP0135 NEW) # valid for DOWNLOAD_EXTRACT_TIMESTAMP option in CMake 3.24 and later
    endif ()
    FetchContent_Declare(${FetchContent_Declare_ARG})
    cmake_policy(POP)
    FetchContent_MakeAvailable(${packageNameLower})
    set(__return True)
  endif ()

  if (NOT __return)
    message(FATAL_ERROR "At least one of the REMOTE or LOCAL argument needs to be set when calling InfaPackage_Add()")
  endif ()
endmacro()