package utils

import (
	"crypto/rand"
	"encoding/hex"
	"time"
)

//read bytes from random device
func SafeRandom(dest []byte) {
	if _, err := rand.Read(dest); err != nil {
		panic(err)
	}
}

// generate a 16 chars of instance id
// 4 bytes (secs from 2019-06-01 00:00:00) + 4 bytes real random, generate 2^32 random id per seconds at most
func RandomInstanceID() string {
	var randBytes = make([]byte, 4)
	SafeRandom(randBytes)
	start, _ := time.Parse("2006-01-02 15:04:05", "2019-06-01 00:00:00")
	seed := uInt32ToBytes(uint32(time.Now().UnixNano() - start.UnixNano()))
	var dest = make([]byte, 16)
	hex.Encode(dest, seed)
	hex.Encode(dest[8:16], randBytes)
	// convert leading digit to letter
	if dest[0] >= '0' && dest[0] <= '9' {
		dest[0] = byte(dest[0]) + 49
	}
	return string(dest)
}
