#-------------------------------------------------------------------------------
# Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------
macro(generate_uuid_formats uuid)
	#Create a list of byte
	string(REGEX MATCHALL "([A-Za-z0-9][A-Za-z0-9])" SEPARATED_HEX "${uuid}")
	list(JOIN SEPARATED_HEX ", 0x" UUID_BYTES )
	#Generate the uuid_byte string
	#{ 0x01, 0x10, 0x9c, 0xf8, 0xe5, 0xca, 0x44, 0x6f,
	# 0x9b, 0x55, 0xf3, 0xcd, 0xc6, 0x51, 0x10, 0xc8, }

	string(PREPEND UUID_BYTES "{0x")
	string(APPEND UUID_BYTES "}")

	#Split the list of bytes in to the struct fields
	list(SUBLIST SEPARATED_HEX 0 4 uuid_timeLow)
	list(SUBLIST SEPARATED_HEX 4 2 uuid_timeMid)
	list(SUBLIST SEPARATED_HEX 6 2 uuid_timeHiAndVersion)
	list(SUBLIST SEPARATED_HEX 8 8 uuid_clockSeqAndNode)

	#Combine the bytes in the fields
	list(JOIN uuid_timeLow "" uuid_timeLow )
	string(PREPEND uuid_timeLow "0x")

	list(JOIN uuid_timeMid "" uuid_timeMid )
	string(PREPEND uuid_timeMid " 0x")

	list(JOIN uuid_timeHiAndVersion "" uuid_timeHiAndVersion )
	string(PREPEND uuid_timeHiAndVersion " 0x")

	list(JOIN uuid_clockSeqAndNode ", 0x" uuid_clockSeqAndNode )
	string(PREPEND uuid_clockSeqAndNode " 0x")

	#Combine the different fields into one uuid_struct string
	#{ 0x01109cf8, 0xe5ca, 0x446f, \
	#{ 0x9b, 0x55, 0xf3, 0xcd, 0xc6, 0x51, 0x10, 0xc8 } }

	string(CONCAT UUID_STRUCT "{" ${uuid_timeLow} "," ${uuid_timeMid}
		"," ${uuid_timeHiAndVersion} ", {" ${uuid_clockSeqAndNode} "}}")

	# Swith endianess
	list(SUBLIST SEPARATED_HEX 0 4 hex1)
	list(SUBLIST SEPARATED_HEX 4 4 hex2)
	list(SUBLIST SEPARATED_HEX 8 4 hex3)
	list(SUBLIST SEPARATED_HEX 12 4 hex4)

	list(REVERSE hex1)
	list(REVERSE hex2)
	list(REVERSE hex3)
	list(REVERSE hex4)
	string(CONCAT UUID_LE " 0x" ${hex1} " 0x" ${hex2} " 0x" ${hex3}
		" 0x" ${hex4})

endmacro()

#[===[.rst:
.. cmake:command:: set_target_uuids

.. code:: cmake

set_target_uuids(
	SP_UUID <uuid>
	SP_NAME <name>
	)

INPUTS:

``SP_UUID``
The UUID of the SP as a string.

``SP_NAME``
The name of the SP.

OUTPUTS:

``SP_UUID_LE``
SP_UUID converted to little-endian binary format.

#]===]

function (set_target_uuids)
	set(options)
	set(oneValueArgs SP_UUID SP_NAME)
	set(multiValueArgs)
	cmake_parse_arguments(TARGET "${options}" "${oneValueArgs}"
		"${multiValueArgs}" ${ARGN} )

	if(NOT DEFINED TARGET_SP_UUID)
		message(FATAL_ERROR "set_target_uuids: mandatory parameter SP_UUID not defined!")
	endif()
	if(NOT DEFINED TARGET_SP_NAME)
		message(FATAL_ERROR "set_target_uuids: mandatory parameter SP_NAME not defined!")
	endif()

	generate_uuid_formats(${TARGET_SP_UUID})
	target_compile_definitions(${TARGET_SP_NAME}
		PRIVATE OPTEE_SP_UUID=${UUID_STRUCT}
		PRIVATE OPTEE_SP_UUID_BYTES=${UUID_BYTES}
	)
	set(SP_UUID_LE ${UUID_LE} PARENT_SCOPE)
endfunction()
