package util

import (
	"regexp"
	"strconv"
	"testing"
)

func TestNewSecret(t *testing.T) {
	secret, err := NewSecret()
	if err != nil {
		t.Errorf("Error creating new secret: %v", err)
	}
	if len(secret) == 0 {
		t.Error("Generated secret is empty")
	}
}

func TestNewSecretWithLength(t *testing.T) {
	length := 10
	secret, err := NewSecretWithLength(length)
	if err != nil {
		t.Errorf("Error creating new secret with length %d: %v", length, err)
	}
	if len(secret) != length {
		t.Errorf("Generated secret length expected to be %d, got %d", length, len(secret))
	}
}

func TestRandomString(t *testing.T) {
	length := 10
	str, err := RandomString(length)
	if err != nil {
		t.Errorf("Error generating random string: %v", err)
	}
	if len(str) != length {
		t.Errorf("Random string length expected to be %d, got %d", length, len(str))
	}
}

func TestCryptID(t *testing.T) {
	input := "testString"
	length := 8
	encrypted, err := cryptID(input, length)
	if err != nil {
		t.Errorf("Error encrypting string: %v", err)
	}
	if len(encrypted) != length {
		t.Errorf("Encrypted string length expected to be %d, got %d", length, len(encrypted))
	}
}

func TestHashString(t *testing.T) {
	input := "testString"
	hashed := hashString(input)
	if _, err := strconv.Atoi(hashed); err != nil {
		t.Errorf("Hashed string is not a valid number: %s", hashed)
	}
}

func TestBuildTextKey(t *testing.T) {
	tests := []struct {
		input         string
		expectedRegex string
	}{
		{"Test Key", "^test-key$"},
		{"", "^$"},
		{"ThisIsALongTextKeyThatExceedsTheLimit", "^this-is-along-text-k-[0-9]+$"},
		{"MixedCaseInput", "^mixed-case-input$"},
		{"With Spaces", "^with-spaces$"},
		{"123Numbers456", "^123numbers456$"},
		{"Special#Characters!", "^special-characters$"},
		{"Short", "^short$"},
		{"LongerThanTwentyCharactersInputString", "^longer-than-twenty-c-[0-9]+$"},
		{"-StartsInDash", "^starts-in-dash$"},
		{"EndsInDash-", "^ends-in-dash$"},
		{"With--Multiple--Dashes", "^with-multiple-dashes$"},
		{"EndsInDash-", "^ends-in-dash$"},
		{"-StartsInDash", "^starts-in-dash$"},
		{"Emojis🚀AreCool", "^emojis-are-cool$"},
	}

	for _, test := range tests {
		output, err := BuildTextKey(test.input)
		if err != nil {
			t.Errorf("Error building text key for input '%s': %v", test.input, err)
		}
		matched, _ := regexp.MatchString(test.expectedRegex, output)
		if !matched {
			t.Errorf("Output '%s' does not match expected regex '%s' for input '%s'", output, test.expectedRegex, test.input)
		}
	}
}