package privacy_test

import (
	"testing"

	"github.com/jfraeys/fetch_ml/internal/privacy"
)

func TestDetectPII(t *testing.T) {
	tests := []struct {
		name     string
		text     string
		expected []string // Expected PII types found
	}{
		{
			name:     "email detection",
			text:     "Contact me at user@example.com for details",
			expected: []string{"email"},
		},
		{
			name:     "SSN detection",
			text:     "My SSN is 123-45-6789",
			expected: []string{"ssn"},
		},
		{
			name:     "phone detection",
			text:     "Call me at 555-123-4567",
			expected: []string{"phone"},
		},
		{
			name:     "IP address detection",
			text:     "Server at 192.168.1.1",
			expected: []string{"ip_address"},
		},
		{
			name:     "multiple PII types",
			text:     "Email: test@example.com, SSN: 123-45-6789",
			expected: []string{"email", "ssn"},
		},
		{
			name:     "no PII",
			text:     "This is just a normal hypothesis about learning rates",
			expected: []string{},
		},
		{
			name:     "credit card detection",
			text:     "Card: 4111-1111-1111-1111",
			expected: []string{"credit_card"},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			findings := privacy.DetectPII(tt.text)

			if len(tt.expected) == 0 {
				if len(findings) != 0 {
					t.Errorf("expected no PII, found %d findings", len(findings))
				}
				return
			}

			// Check that all expected types are found
			foundTypes := make(map[string]bool)
			for _, f := range findings {
				foundTypes[f.Type] = true
			}

			for _, expectedType := range tt.expected {
				if !foundTypes[expectedType] {
					t.Errorf("expected to find %s, but didn't", expectedType)
				}
			}
		})
	}
}

func TestHasPII(t *testing.T) {
	tests := []struct {
		name     string
		text     string
		expected bool
	}{
		{
			name:     "has PII",
			text:     "Contact: user@example.com",
			expected: true,
		},
		{
			name:     "no PII",
			text:     "Learning rate 0.01 worked well",
			expected: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := privacy.HasPII(tt.text)
			if result != tt.expected {
				t.Errorf("HasPII() = %v, want %v", result, tt.expected)
			}
		})
	}
}

func TestRedactSample(t *testing.T) {
	tests := []struct {
		name  string
		match string
		want  string
	}{
		{
			name:  "short match",
			match: "abc",
			want:  "[PII]",
		},
		{
			name:  "long match",
			match: "user@example.com",
			want:  "us...om",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := privacy.RedactSample(tt.match)
			if got != tt.want {
				t.Errorf("redactSample() = %v, want %v", got, tt.want)
			}
		})
	}
}
