package util

import (
	"bytes"
	"crypto/sha1"
	"encoding/hex"
	"fmt"
	"os"
	"strconv"
	"strings"
	"text/template"
	"time"
)

func Render(file string, data interface{}) ([]byte, error) {
	var (
		rendered *bytes.Buffer
		tmpl     *template.Template
		content  []byte
		err      error
	)

	if content, err = os.ReadFile(file); err != nil {
		return nil, err
	}

	if tmpl, err = template.New("template").Parse(string(content)); err != nil {
		return nil, err
	}

	rendered = bytes.NewBuffer(nil)
	err = tmpl.Execute(rendered, data)

	return rendered.Bytes(), err
}

func GetDuration(d string) (time.Duration, error) {
	var (
		d_num uint64
		err   error
	)

	d_num_end := d[len(d)-1]
	d_num_str := strings.TrimSuffix(d, string(d_num_end))

	if d_num, err = strconv.ParseUint(d_num_str, 10, 64); err != nil {
		return 0, err
	}

	switch d_num_end {
	case 's':
		return time.Duration(d_num) * (time.Second), nil

	case 'm':
		return time.Duration(d_num) * (time.Second * 60), nil

	case 'h':
		return time.Duration(d_num) * ((time.Second * 60) * 60), nil
	}

	return 0, fmt.Errorf("invalid time duration format")
}

func GetSHA1(s string) string {
	hasher := sha1.New()
	return hex.EncodeToString(hasher.Sum([]byte(s)))
}