package bleve

import (
	"testing"

	"github.com/blevesearch/bleve/v2"
	"github.com/stretchr/testify/require"
)

func TestParseQuery(t *testing.T) {
	mapping := bleve.NewIndexMapping()
	mapping.DefaultAnalyzer = "en"
	index, err := bleve.NewMemOnly(mapping)
	require.NoError(t, err)

	docs := []map[string]interface{}{
		{"id": "1", "phrase": "I like fruit especially banana and strawberry"},
		{"id": "2", "phrase": "I like fruit like apples and oranges"},
		{"id": "3", "phrase": "I like vegetables but not fruit"},
		{"id": "4", "phrase": "Banana bread is delicious"},
		{"id": "5", "phrase": "Strawberry jam and banana smoothie"},
	}

	for _, doc := range docs {
		err := index.Index(doc["id"].(string), doc)
		require.NoError(t, err)
	}

	testQueries := []struct {
		query        string
		expected     int
		exactMatches []string
	}{
		{"fruit", 3, nil},
		{"banana (NOT delicious)", 2, nil},
		{"banana (NOT delicious) bread", 0, nil},
		{"smoothie OR apples", 2, nil},
		{"smoothie OR apples (NOT fruit)", 1, nil},
		{"\"I like\"", 3, []string{"i like"}},
		{"banana \"I like fruit\" strawberries", 1, []string{"i like fruit"}},
		{"\"I like fruit\" (strawberry OR apple)", 2, []string{"i like fruit"}},
	}

	for _, test := range testQueries {
		query, exactMatches, err := parse(test.query, "phrase")
		require.NoError(t, err)

		require.Equal(t, test.exactMatches, exactMatches)

		search := bleve.NewSearchRequest(query)
		results, err := index.Search(search)
		require.NoError(t, err)

		require.Equal(t, test.expected, int(results.Total),
			"query '%s' expected %d results, got %d", test.query, test.expected, results.Total)
	}
}
