##
# Copyright (C) 2014 Raster Software Vigo
# Autovala is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Autovala is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Copyright (C) 2013, Valama development team
#
# Copyright 2009-2010 Jakob Westhoff All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 
#	1. Redistributions of source code must retain the above copyright notice,
#	   this list of conditions and the following disclaimer.
# 
#	2. Redistributions in binary form must reproduce the above copyright notice,
#	   this list of conditions and the following disclaimer in the documentation
#	   and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# The views and conclusions contained in the software and documentation are those
# of the authors and should not be interpreted as representing official policies,
# either expressed or implied, of Jakob Westhoff
##

include(ParseArguments)
find_package(Vala REQUIRED)

##
# Ensure a certain valac version is available
#
# The initial argument is the version to check for
# 
# It may be followed by a optional parameter to specifiy a version range. The
# following options are valid:
# 
# EXACT
#   Vala needs to be available in the exact version given
# 
# MINIMUM
#   The provided version is the minimum version. Therefore Vala needs to be
#   available in the given version or any higher version
#
# MAXIMUM
#   The provided version is the maximum. Therefore Vala needs to be available
#   in the given version or any version older than this
#
# If no option is specified the version will be treated as a minimal version.
##
macro(ensure_vala_version ensure_version)

	if (USE_VALA_BINARY)
		message(STATUS "Forced use of vala binary ${USE_VALA_BINARY}")
		set(VALA_EXECUTABLE ${USE_VALA_BINARY})
	else (USE_VALA_BINARY)

		message(STATUS "checking for Vala version of valac-${ensure_version}")
	
		unset(version_accepted)
		execute_process(COMMAND "valac-${ensure_version}" "--version"
			OUTPUT_VARIABLE "VALA_VERSION" OUTPUT_STRIP_TRAILING_WHITESPACE)
		if (NOT VALA_VERSION)
	
			find_program(VALA_EXECUTABLE "valac")
	
			# If the specific version asked for this project is not found,
			# try to use the one pointed by the valac link
	
			parse_arguments(ARGS "" "MINIMUM;MAXIMUM;EXACT" ${ARGN})
			set(compare_message "")
			set(error_message "")
			if(ARGS_MINIMUM)
				set(compare_message "a minimum ")
				set(error_message "or greater ")
			elseif(ARGS_MAXIMUM)
				set(compare_message "a maximum ")
				set(error_message "or less ")
			endif(ARGS_MINIMUM)
	
			message(STATUS "checking for ${compare_message}Vala version of ${ensure_version}" )
	
			execute_process(COMMAND ${VALA_EXECUTABLE} "--version"
				OUTPUT_VARIABLE "VALA_VERSION" OUTPUT_STRIP_TRAILING_WHITESPACE)
		else(NOT VALA_VERSION)
			set(VALA_EXECUTABLE "valac-${ensure_version}")
		endif(NOT VALA_VERSION)

		# this code allows to identify development versions as the right version
		# e.g. 0.19.1 -> 0.20 ; 0.20.1 -> 0.20 ; 0.24.0.2-2235 -> 0.26
		# Thanks to Yannick Inizan
		string(REPLACE "Vala" "" "VALA_VERSION" ${VALA_VERSION})
		string(STRIP ${VALA_VERSION} "VALA_VERSION")
		string(REPLACE "." ";" VALA_LIST "${VALA_VERSION}")
		list(GET VALA_LIST 0 maj_ver)
		list(GET VALA_LIST 1 min_ver)
		list(GET VALA_LIST 2 rev_ver)
		math(EXPR is_odd "${min_ver} % 2")
		list(LENGTH VALA_LIST len)
		if((${is_odd} EQUAL 1))
			math(EXPR min_ver "${min_ver} + 1")
		elseif(len GREATER 3)
			math(EXPR min_ver "${min_ver} + 2")
		endif()

		set(VALA_SVERSION "${maj_ver}.${min_ver}" CACHE INTERNAL "")

		# MINIMUM is the default if no option is specified
		if(ARGS_EXACT)
			if(${VALA_SVERSION} VERSION_EQUAL ${ensure_version} )
				set(version_accepted TRUE)
			endif(${VALA_SVERSION} VERSION_EQUAL ${ensure_version})
		elseif(ARGS_MAXIMUM)
			if(${VALA_SVERSION} VERSION_LESS ${ensure_version} OR ${VALA_SVERSION} VERSION_EQUAL ${ensure_version})
				set(version_accepted TRUE)
			endif(${VALA_SVERSION} VERSION_LESS ${ensure_version} OR ${VALA_SVERSION} VERSION_EQUAL ${ensure_version})
		else(ARGS_MAXIMUM)
			if(${VALA_SVERSION} VERSION_GREATER ${ensure_version} OR ${VALA_SVERSION} VERSION_EQUAL ${ensure_version})
				set(version_accepted TRUE)
			endif(${VALA_SVERSION} VERSION_GREATER ${ensure_version} OR ${VALA_SVERSION} VERSION_EQUAL ${ensure_version})
		endif(ARGS_EXACT)
	
		if (NOT version_accepted)
			message(FATAL_ERROR 
				"Vala version ${ensure_version} ${error_message}is required."
			)
		endif(NOT version_accepted)
	
		message(STATUS
			"  found Vala, version ${VALA_SVERSION}"
		)
	endif(USE_VALA_BINARY)
endmacro(ensure_vala_version)
