package contracts

// OutputFormat matches SearXNG's `/search?format=...` values.
type OutputFormat string

const (
	FormatHTML OutputFormat = "html" // accepted for compatibility (not yet implemented)
	FormatJSON OutputFormat = "json"
	FormatCSV  OutputFormat = "csv"
	FormatRSS  OutputFormat = "rss"
)

type SearchRequest struct {
	// Format is what the client requested via `format=...`.
	Format OutputFormat

	Query string

	Pageno     int
	Safesearch int
	TimeRange  *string

	TimeoutLimit *float64
	Language     string

	// Engines and categories are used for deciding which engines run locally vs are proxied.
	// For now, engines can be supplied directly via the `engines` form parameter.
	Engines    []string
	Categories []string

	// EngineData matches SearXNG's `engine_data-<engine>-<key>=<value>` parameters.
	EngineData map[string]map[string]string

	// AccessToken is an optional request token used to gate paid/limited engines.
	// It is not part of the upstream JSON schema; it only influences local engines.
	AccessToken string
}

// SearchResponse matches the JSON schema returned by SearXNG's `webutils.get_json_response()`.
type SearchResponse struct {
	Query                string         `json:"query"`
	NumberOfResults     int            `json:"number_of_results"`
	Results              []MainResult  `json:"results"`
	Answers              []map[string]any     `json:"answers"`
	Corrections          []string      `json:"corrections"`
	Infoboxes            []map[string]any     `json:"infoboxes"`
	Suggestions          []string      `json:"suggestions"`
	UnresponsiveEngines [][2]string   `json:"unresponsive_engines"`
}

