package bleve

import (
	"os"
	"tercul/internal/domain"
	"testing"

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

func TestBleveClient(t *testing.T) {
	// Temporary index path for testing
	tempIndexPath := "test_bleve_index"
	defer func() { _ = os.RemoveAll(tempIndexPath) }() // Clean up after the test

	// Initialize a new Bleve client
	client, err := NewBleveClient(tempIndexPath)
	require.NoError(t, err, "Failed to create a new Bleve client")
	defer func() { _ = client.Close() }()

	// Define test cases for AddTranslation and Search
	tests := []struct {
		name         string
		translation  domain.Translation
		searchQuery  string
		expectedHits int
	}{
		{
			name: "Index and search single translation",
			translation: domain.Translation{
				BaseModel: domain.BaseModel{ID: 1},
				Title:     "Golang Basics",
				Content:   "Learn Go programming",
				Language:  "en",
			},
			searchQuery:  "Golang",
			expectedHits: 1,
		},
		{
			name: "No matches for unrelated query",
			translation: domain.Translation{
				BaseModel: domain.BaseModel{ID: 2},
				Title:     "Python Basics",
				Content:   "Learn Python programming",
				Language:  "en",
			},
			searchQuery:  "Rust",
			expectedHits: 0,
		},
		{
			name: "Index and search multiple translations",
			translation: domain.Translation{
				BaseModel: domain.BaseModel{ID: 3},
				Title:     "Advanced Go",
				Content:   "Deep dive into Go programming",
				Language:  "en",
			},
			searchQuery:  "Go",
			expectedHits: 2,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			// Index the translation
			err := client.AddTranslation(tt.translation)
			require.NoError(t, err, "Failed to index translation")

			// Perform the search with empty filters
			result, err := client.Search(tt.searchQuery, map[string]string{}, 10)
			require.NoError(t, err, "Search query failed")
			assert.GreaterOrEqual(t, len(result.Hits), tt.expectedHits, "Unexpected number of hits")
		})
	}
}

func TestBleveClientInitialization(t *testing.T) {
	tempIndexPath := "test_init_index"
	defer func() { _ = os.RemoveAll(tempIndexPath) }() // Clean up

	t.Run("New Index Initialization", func(t *testing.T) {
		client, err := NewBleveClient(tempIndexPath)
		require.NoError(t, err, "Failed to initialize a new index")
		defer func() { _ = client.Close() }()
		assert.NotNil(t, client.index, "Index should not be nil")
	})

	t.Run("Open Existing Index", func(t *testing.T) {
		client, err := NewBleveClient(tempIndexPath)
		require.NoError(t, err, "Failed to open an existing index")
		defer func() { _ = client.Close() }()
		assert.NotNil(t, client.index, "Index should not be nil")
	})
}
