package template

import (
	"crypto/sha256"
	"encoding/base64"
	"fmt"
	"strconv"
	"strings"
	"time"

	UUID "github.com/hashicorp/go-uuid"
)

func unixTime() string {
	return strconv.FormatInt(time.Now().Unix(), 10)
}

func unixTimeMillis() string {
	return strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10)
}

func timestamp(format string) string {
	return time.Now().Format(format)
}

func truncate(maxLen int, str string) (string, error) {
	if maxLen <= 0 {
		return "", fmt.Errorf("max length must be > 0 but was %d", maxLen)
	}
	if len(str) > maxLen {
		return str[:maxLen], nil
	}
	return str, nil
}

const (
	sha256HashLen = 8
)

func truncateSHA256(maxLen int, str string) (string, error) {
	if maxLen <= 8 {
		return "", fmt.Errorf("max length must be > 8 but was %d", maxLen)
	}

	if len(str) <= maxLen {
		return str, nil
	}

	truncIndex := maxLen - sha256HashLen
	hash := hashSHA256(str[truncIndex:])
	result := fmt.Sprintf("%s%s", str[:truncIndex], hash[:sha256HashLen])
	return result, nil
}

func hashSHA256(str string) string {
	return fmt.Sprintf("%x", sha256.Sum256([]byte(str)))
}

func encodeBase64(str string) string {
	return base64.StdEncoding.EncodeToString([]byte(str))
}

func uppercase(str string) string {
	return strings.ToUpper(str)
}

func lowercase(str string) string {
	return strings.ToLower(str)
}

func replace(find string, replace string, str string) string {
	return strings.ReplaceAll(str, find, replace)
}

func uuid() (string, error) {
	return UUID.GenerateUUID()
}
