package runtime

import (
	"context"
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"testing"

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

func TestSearXNGWebSearchProviderSearchReturnsURLAndTitle(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, request *http.Request) {
		require.Equal(t, http.MethodGet, request.Method)
		require.Equal(t, "/searxng/search", request.URL.Path)
		require.Equal(t, "bread", request.URL.Query().Get("q"))
		require.Equal(t, "json", request.URL.Query().Get("format"))
		require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
			"results": []map[string]any{
				{"url": "https://example.com/a#section", "title": " Example A ", "content": "ignored"},
				{"url": "https://example.com/a", "title": "duplicate"},
				{"url": "file:///etc/passwd", "title": "invalid"},
				{"url": "https://example.org/b", "title": ""},
			},
		}))
	}))
	defer server.Close()

	provider, err := NewSearXNGWebSearchProvider(server.URL+"/searxng/", server.Client())
	require.NoError(t, err)
	results, err := provider.Search(context.Background(), " bread ", 5)

	require.NoError(t, err)
	require.Equal(t, []WebSearchResult{
		{URL: "https://example.com/a", Title: "Example A"},
		{URL: "https://example.org/b"},
	}, results)
}

func TestSearXNGWebSearchProviderSearchAppliesLimit(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
		require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
			"results": []map[string]any{
				{"url": "https://example.com/1", "title": "one"},
				{"url": "https://example.com/2", "title": "two"},
			},
		}))
	}))
	defer server.Close()

	provider, err := NewSearXNGWebSearchProvider(server.URL, server.Client())
	require.NoError(t, err)
	results, err := provider.Search(context.Background(), "bread", 1)

	require.NoError(t, err)
	require.Equal(t, []WebSearchResult{{URL: "https://example.com/1", Title: "one"}}, results)
}

func TestNewSearXNGWebSearchProviderRejectsInvalidBaseURL(t *testing.T) {
	_, err := NewSearXNGWebSearchProvider("localhost:8080", nil)
	require.Error(t, err)
}
