package utils

import (
	"regexp"
	"testing"
)

func TestGenerateShortID(t *testing.T) {
	// Test that it generates a 12-character ID
	id, err := GenerateShortID()
	if err != nil {
		t.Fatalf("GenerateShortID() error = %v", err)
	}

	if len(id) != 12 {
		t.Errorf("GenerateShortID() length = %d, want 12", len(id))
	}

	// Verify it only contains valid alphabet characters
	// Default nanoid alphabet uses A-Za-z0-9_- symbols (64 characters)
	validPattern := regexp.MustCompile(`^[0-9A-Za-z_-]{12}$`)
	if !validPattern.MatchString(id) {
		t.Errorf("GenerateShortID() = %q, contains invalid characters", id)
	}

	// Test uniqueness - generate multiple IDs and check they're different
	ids := make(map[string]bool)
	for i := 0; i < 100; i++ {
		id, err := GenerateShortID()
		if err != nil {
			t.Fatalf("GenerateShortID() iteration %d error = %v", i, err)
		}
		if ids[id] {
			t.Errorf("GenerateShortID() produced duplicate: %q", id)
		}
		ids[id] = true
	}
}

func TestGenerateLongID(t *testing.T) {
	// Test that it generates a 21-character ID
	id, err := GenerateLongID()
	if err != nil {
		t.Fatalf("GenerateLongID() error = %v", err)
	}

	if len(id) != 21 {
		t.Errorf("GenerateLongID() length = %d, want 21", len(id))
	}

	// Verify it only contains valid alphabet characters
	// Default nanoid alphabet uses A-Za-z0-9_- symbols (64 characters)
	validPattern := regexp.MustCompile(`^[0-9A-Za-z_-]{21}$`)
	if !validPattern.MatchString(id) {
		t.Errorf("GenerateLongID() = %q, contains invalid characters", id)
	}

	// Test uniqueness - generate multiple IDs and check they're different
	ids := make(map[string]bool)
	for i := 0; i < 100; i++ {
		id, err := GenerateLongID()
		if err != nil {
			t.Fatalf("GenerateLongID() iteration %d error = %v", i, err)
		}
		if ids[id] {
			t.Errorf("GenerateLongID() produced duplicate: %q", id)
		}
		ids[id] = true
	}
}

func TestIDsAreDifferent(t *testing.T) {
	// Verify that short and long IDs are different types
	shortID, err := GenerateShortID()
	if err != nil {
		t.Fatalf("GenerateShortID() error = %v", err)
	}

	longID, err := GenerateLongID()
	if err != nil {
		t.Fatalf("GenerateLongID() error = %v", err)
	}

	if len(shortID) == len(longID) {
		t.Error("Short and long IDs should have different lengths")
	}

	if len(shortID) != 12 {
		t.Errorf("Short ID length = %d, want 12", len(shortID))
	}

	if len(longID) != 21 {
		t.Errorf("Long ID length = %d, want 21", len(longID))
	}
}