package uuid

import (
	
	
	
	
)

// GenerateRandomBytes is used to generate random bytes of given size.
func ( int) ([]byte, error) {
	return GenerateRandomBytesWithReader(, rand.Reader)
}

// GenerateRandomBytesWithReader is used to generate random bytes of given size read from a given reader.
func ( int,  io.Reader) ([]byte, error) {
	if  == nil {
		return nil, fmt.Errorf("provided reader is nil")
	}
	 := make([]byte, )
	if ,  := io.ReadFull(, );  != nil {
		return nil, fmt.Errorf("failed to read random bytes: %v", )
	}
	return , nil
}


const uuidLen = 16

// GenerateUUID is used to generate a random UUID
func () (string, error) {
	return GenerateUUIDWithReader(rand.Reader)
}

// GenerateUUIDWithReader is used to generate a random UUID with a given Reader
func ( io.Reader) (string, error) {
	if  == nil {
		return "", fmt.Errorf("provided reader is nil")
	}
	,  := GenerateRandomBytesWithReader(uuidLen, )
	if  != nil {
		return "", 
	}
	return FormatUUID()
}

func ( []byte) (string, error) {
	if  := len();  != uuidLen {
		return "", fmt.Errorf("wrong length byte slice (%d)", )
	}

	return fmt.Sprintf("%x-%x-%x-%x-%x",
		[0:4],
		[4:6],
		[6:8],
		[8:10],
		[10:16]), nil
}

func ( string) ([]byte, error) {
	if len() != 2 * uuidLen + 4 {
		return nil, fmt.Errorf("uuid string is wrong length")
	}

	if [8] != '-' ||
		[13] != '-' ||
		[18] != '-' ||
		[23] != '-' {
		return nil, fmt.Errorf("uuid is improperly formatted")
	}

	 := [0:8] + [9:13] + [14:18] + [19:23] + [24:36]

	,  := hex.DecodeString()
	if  != nil {
		return nil, 
	}
	if len() != uuidLen {
		return nil, fmt.Errorf("decoded hex is the wrong length")
	}

	return , nil
}