package engines

import (
	"context"
	"net/http"
	"testing"

	"github.com/ashie/gosearch/internal/contracts"
)

func TestQwantEngine_Web(t *testing.T) {
	transport := roundTripperFunc(func(r *http.Request) (*http.Response, error) {
		if r.Method != http.MethodGet {
			return httpResponse(http.StatusMethodNotAllowed, "", ""), nil
		}
		if r.URL.Host != "api.qwant.com" {
			return httpResponse(http.StatusNotFound, "", ""), nil
		}
		if r.URL.Path != "/v3/search/web" {
			t.Fatalf("unexpected path: %s", r.URL.Path)
		}

		q := r.URL.Query().Get("q")
		if q != "hugo" {
			t.Fatalf("unexpected q: %q", q)
		}
		if r.URL.Query().Get("count") != "10" {
			t.Fatalf("unexpected count: %q", r.URL.Query().Get("count"))
		}
		if r.URL.Query().Get("locale") != "en_US" {
			t.Fatalf("unexpected locale: %q", r.URL.Query().Get("locale"))
		}
		if r.URL.Query().Get("safesearch") != "0" {
			t.Fatalf("unexpected safesearch: %q", r.URL.Query().Get("safesearch"))
		}
		if r.URL.Query().Get("llm") != "false" {
			t.Fatalf("unexpected llm: %q", r.URL.Query().Get("llm"))
		}
		if r.URL.Query().Get("tgp") != "3" {
			t.Fatalf("unexpected tgp: %q", r.URL.Query().Get("tgp"))
		}
		if r.URL.Query().Get("offset") != "0" {
			t.Fatalf("unexpected offset: %q", r.URL.Query().Get("offset"))
		}

		body := `{
  "status": "success",
  "data": {
    "result": {
      "items": {
        "mainline": [
          {
            "type": "web",
            "items": [
              { "title": "Qwant Title", "url": "https://example.com/q", "desc": "Qwant description" }
            ]
          }
        ]
      }
    }
  }
}`
		return httpResponse(http.StatusOK, body, "application/json"), nil
	})

	client := &http.Client{Transport: transport}
	engine := &QwantEngine{client: client, category: "web", resultsPerPage: 10}

	resp, err := engine.Search(context.Background(), contracts.SearchRequest{
		Query:      "hugo",
		Pageno:     1,
		Safesearch: 0,
		Language:   "en",
	})
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	}
	if len(resp.Results) != 1 {
		t.Fatalf("expected 1 result, got %d", len(resp.Results))
	}
	if resp.Results[0].Title != "Qwant Title" {
		t.Fatalf("unexpected title: %q", resp.Results[0].Title)
	}
	if resp.Results[0].Content != "Qwant description" {
		t.Fatalf("unexpected content: %q", resp.Results[0].Content)
	}
	if resp.Results[0].URL == nil || *resp.Results[0].URL != "https://example.com/q" {
		t.Fatalf("unexpected url: %v", resp.Results[0].URL)
	}
	if resp.Results[0].Engine != "qwant" {
		t.Fatalf("unexpected engine: %q", resp.Results[0].Engine)
	}
}

