// Package searchengine owns the shared Catalog contract used by independently
// named search-provider Builtin Extensions.
package searchengine

import (
	"github.com/tidbcloud/AgentTeam/internal/extension/registry"
	"github.com/tidbcloud/AgentTeam/internal/extension/spec"
)

const ActionSearch = "search"

// NewDefinition returns one provider-owned search Definition.
func NewDefinition(
	provider string,
	displayName string,
	description string,
) registry.Definition {
	return registry.Definition{
		Domain:      provider,
		Version:     1,
		Name:        displayName,
		Description: description,
		Actions: []registry.DefinitionAction{{
			Name:        ActionSearch,
			Summary:     "Search the web with " + displayName,
			Description: description,
			Safety: spec.Safety{
				Class:       "read",
				Idempotent:  true,
				Destructive: false,
			},
			InputSchema:  searchInputSchema(),
			OutputSchema: searchOutputSchema(),
			Example: map[string]any{
				"query": "AgentTeam Extension platform",
				"limit": 5,
			},
		}},
	}
}

func searchInputSchema() map[string]any {
	return map[string]any{
		"$schema":              "https://json-schema.org/draft/2020-12/schema",
		"type":                 "object",
		"additionalProperties": false,
		"required":             []any{"query"},
		"properties": map[string]any{
			"query": map[string]any{
				"type":      "string",
				"minLength": 1,
				"maxLength": 512,
			},
			"limit": map[string]any{
				"type":    "integer",
				"minimum": 1,
				"maximum": 10,
			},
		},
	}
}

func searchOutputSchema() map[string]any {
	item := map[string]any{
		"type":                 "object",
		"additionalProperties": false,
		"required":             []any{"url", "title", "snippet"},
		"properties": map[string]any{
			"url": map[string]any{
				"type":      "string",
				"minLength": 1,
				"format":    "uri",
			},
			"title": map[string]any{
				"type":      "string",
				"maxLength": 512,
			},
			"snippet": map[string]any{
				"type":      "string",
				"maxLength": 4096,
			},
		},
	}
	return map[string]any{
		"$schema":              "https://json-schema.org/draft/2020-12/schema",
		"type":                 "object",
		"additionalProperties": false,
		"required":             []any{"results"},
		"properties": map[string]any{
			"results": map[string]any{
				"type":     "array",
				"maxItems": 10,
				"items":    item,
			},
		},
	}
}
