# Try to find the MPFR C++ (MPREAL) library
# See http://www.holoborodko.com/pavel/mpreal/
#
# This module supports requiring a minimum version, e.g. you can do
#   find_package(MPREAL 1.8.6)
# to require version 1.8.6 or newer of MPREAL C++.
#
# Once done this will define
#
#  MPREAL_FOUND - system has MPREAL lib with correct version
#  MPREAL_INCLUDES - MPREAL required include directories
#  MPREAL_LIBRARIES - MPREAL required libraries
#  MPREAL_VERSION - MPREAL version
# SPDX-License-Identifier: MPL-2.0

# Copyright (c) 2020 The Eigen Authors.
# Redistribution and use is allowed according to the terms of the BSD license.

include(CMakeFindDependencyMacro)
find_dependency(MPFR)
find_dependency(GMP)

# Set MPREAL_INCLUDES
find_path(MPREAL_INCLUDES
  NAMES
  mpreal.h
  PATHS
  $ENV{GMPDIR}
  ${INCLUDE_INSTALL_DIR}
)

# Set MPREAL_FIND_VERSION to 1.0.0 if no minimum version is specified

if(NOT MPREAL_FIND_VERSION)
  if(NOT MPREAL_FIND_VERSION_MAJOR)
    set(MPREAL_FIND_VERSION_MAJOR 1)
  endif()
  if(NOT MPREAL_FIND_VERSION_MINOR)
    set(MPREAL_FIND_VERSION_MINOR 0)
  endif()
  if(NOT MPREAL_FIND_VERSION_PATCH)
    set(MPREAL_FIND_VERSION_PATCH 0)
  endif()

  set(MPREAL_FIND_VERSION "${MPREAL_FIND_VERSION_MAJOR}.${MPREAL_FIND_VERSION_MINOR}.${MPREAL_FIND_VERSION_PATCH}")
endif()

# Check bugs
# - https://github.com/advanpix/mpreal/issues/7
# - https://github.com/advanpix/mpreal/issues/9
set(MPREAL_TEST_PROGRAM "
#include <mpreal.h>
#include <algorithm>
int main(int argc, char** argv) {
  const mpfr::mpreal one  =    1.0;
  const mpfr::mpreal zero =    0.0;
  using namespace std;
  const mpfr::mpreal smaller = min(one, zero);
  return 0;
}")

if(MPREAL_INCLUDES)

  # Set MPREAL_VERSION
  
  file(READ "${MPREAL_INCLUDES}/mpreal.h" _mpreal_version_header)
  
  string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MAJOR[ \t]+([0-9]+)" _mpreal_major_version_match "${_mpreal_version_header}")
  set(MPREAL_MAJOR_VERSION "${CMAKE_MATCH_1}")
  string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MINOR[ \t]+([0-9]+)" _mpreal_minor_version_match "${_mpreal_version_header}")
  set(MPREAL_MINOR_VERSION "${CMAKE_MATCH_1}")
  string(REGEX MATCH "define[ \t]+MPREAL_VERSION_PATCHLEVEL[ \t]+([0-9]+)" _mpreal_patchlevel_version_match "${_mpreal_version_header}")
  set(MPREAL_PATCHLEVEL_VERSION "${CMAKE_MATCH_1}")
  
  set(MPREAL_VERSION ${MPREAL_MAJOR_VERSION}.${MPREAL_MINOR_VERSION}.${MPREAL_PATCHLEVEL_VERSION})
  
  # Check whether found version exceeds minimum version
  
  if(${MPREAL_VERSION} VERSION_LESS ${MPREAL_FIND_VERSION})
    set(MPREAL_VERSION_OK FALSE)
    message(STATUS "MPREAL version ${MPREAL_VERSION} found in ${MPREAL_INCLUDES}, "
                   "but at least version ${MPREAL_FIND_VERSION} is required")
  else()
    set(MPREAL_VERSION_OK TRUE)
    
    list(APPEND MPREAL_INCLUDES "${MPFR_INCLUDES}" "${GMP_INCLUDES}")
    list(REMOVE_DUPLICATES MPREAL_INCLUDES)
    
    list(APPEND MPREAL_LIBRARIES "${MPFR_LIBRARIES}" "${GMP_LIBRARIES}")
    list(REMOVE_DUPLICATES MPREAL_LIBRARIES)
    
    # Make sure it compiles with the current compiler.
    unset(MPREAL_WORKS CACHE)
    include(CheckCXXSourceCompiles)
    set(CMAKE_REQUIRED_INCLUDES "${MPREAL_INCLUDES}")
    set(CMAKE_REQUIRED_LIBRARIES "${MPREAL_LIBRARIES}")
    check_cxx_source_compiles("${MPREAL_TEST_PROGRAM}" MPREAL_WORKS)
  endif()
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MPREAL DEFAULT_MSG
                                  MPREAL_INCLUDES MPREAL_VERSION_OK MPREAL_WORKS)
mark_as_advanced(MPREAL_INCLUDES)
