package utils

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestNormalizeISBN_Validation(t *testing.T) {
	tests := []struct {
		name        string
		input       string
		expected    string
		expectError bool
	}{
		{
			name:        "valid ISBN-13",
			input:       "978-0-306-40615-7",
			expected:    "9780306406157",
			expectError: false,
		},
		{
			name:        "valid ISBN-10 converts to ISBN-13",
			input:       "0-306-40615-2",
			expected:    "9780306406157",
			expectError: false,
		},
		{
			name:        "ISBN-10 with X converts to ISBN-13",
			input:       "0-596-00965-X",
			expected:    "9780596009656",
			expectError: false,
		},
		{
			name:        "empty string",
			input:       "",
			expected:    "",
			expectError: false,
		},
		{
			name:        "11 digits - invalid",
			input:       "97801234567",
			expected:    "",
			expectError: true,
		},
		{
			name:        "12 digits - invalid",
			input:       "978012345678",
			expected:    "",
			expectError: true,
		},
		{
			name:        "14 digits - invalid",
			input:       "97801234567890",
			expected:    "",
			expectError: true,
		},
		{
			name:        "only hyphens",
			input:       "---",
			expected:    "",
			expectError: true,
		},
		{
			name:        "only text",
			input:       "not-an-isbn",
			expected:    "",
			expectError: true,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result, err := NormalizeISBN(tt.input)

			if tt.expectError {
				require.Error(t, err)
				assert.Equal(t, "", result)
			} else {
				require.NoError(t, err)
				assert.Equal(t, tt.expected, result)
			}
		})
	}
}

func TestConvertISBN10To13(t *testing.T) {
	tests := []struct {
		name     string
		isbn10   string
		expected string
	}{
		{
			name:     "ISBN-10 0-306-40615-2",
			isbn10:   "0306406152",
			expected: "9780306406157",
		},
		{
			name:     "ISBN-10 0-596-00965-X (X checksum)",
			isbn10:   "059600965X",
			expected: "9780596009656",
		},
		{
			name:     "ISBN-10 0-8044-2957-X",
			isbn10:   "080442957X",
			expected: "9780804429573",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result, err := convertISBN10To13(tt.isbn10)
			require.NoError(t, err)
			assert.Equal(t, tt.expected, result)
		})
	}
}
