<?php

namespace Planaday\Utility\DataGrouping;

use Exception;

class UUIDGenerator {
	/**
	 * @param string|null $data
	 *
	 * @return string
	 * @throws Exception exception that does not exist before PHP 8
	 */
	public function generateUUIDv4(?string $data = null): string {
		return self::generateUUIDv4Static($data);
	}

	/**
	 * @param string|null $data
	 *
	 * @return string
	 * @throws Exception exception that does not exist before PHP 8
	 */
	public static function generateUUIDv4Static(?string $data = null): string {
		// Generate 16 bytes (128 bits) of random data or use the data passed into the function.
		$data = $data ?? random_bytes(16);
		if(!(strlen($data) == 16)) throw new Exception('Invalid data length');

		// Set version to 0100
		$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
		// Set bits 6-7 to 10
		$data[8] = chr(ord($data[8]) & 0x3f | 0x80);

		// Output the 36 character UUID.
		return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
	}

	public static function generateUUIDv4OrRandom(?string $data = null): string {
		try {
			return self::generateUUIDv4Static($data);
		} catch ( Exception ) {
			return uniqid("", true);
		}
	}

}