/** @module
  Search the web from Agency code, backed by the Brave Search API
  (https://brave.com/search/api/). Use `tavilySearch` for AI-optimized results.

  ```ts
  import { search } from "std::web/search"

  node main() {
    const results = search("agency language programming")
    print(results)
  }
  ```
*/

import { _search, _tavilySearch } from "agency-lang/stdlib-lib/search.js"

type SearchResult = {
  title: string;
  url: string;
  description: string
}

effect std::search { query: string, count: number, country: string, searchLang: string, safesearch: string, freshness: string }
effect std::tavilySearch { query: string, count: number, searchDepth: string, topic: string }

export def search(
  query: string,
  count: number = 5,
  apiKey: string = "",
  country: string = "",
  searchLang: string = "",
  safesearch: string = "",
  freshness: string = "",
): SearchResult[] {
  """
  Search the web. Returns a list of results with title, url, and description.

  @param query - The search query
  @param count - Number of results to return
  @param apiKey - Brave Search API key (defaults to the BRAVE_API_KEY env var)
  @param country - Two-letter country code to localize results (e.g. "US")
  @param searchLang - Language code for results (e.g. "en")
  @param safesearch - Safe search level: "off", "moderate", or "strict"
  @param freshness - Time filter: "pd" (past day), "pw" (past week), "pm" (past month), "py" (past year)
  """
  return interrupt std::search("Are you sure you want to perform this web search?", {
    query: query,
    count: count,
    country: country,
    searchLang: searchLang,
    safesearch: safesearch,
    freshness: freshness
  })
  return _search(
    query,
    {
    count: count,
    apiKey: apiKey,
    country: country,
    searchLang: searchLang,
    safesearch: safesearch,
    freshness: freshness
  },
  )
}

/**
  Get a free Tavily key (no credit card) at https://tavily.com.
*/
export def tavilySearch(
  query: string,
  count: number = 5,
  apiKey: string = "",
  searchDepth: string = "",
  topic: string = "",
): SearchResult[] {
  """
  Search the web with Tavily, a search API built for AI agents. Returns a list of results with title, url, and description.

  @param query - The search query
  @param count - Number of results to return
  @param apiKey - Tavily API key (defaults to the TAVILY_API_KEY env var)
  @param searchDepth - "basic" for fast results or "advanced" for deeper retrieval
  @param topic - "general" or "news"
  """
  return interrupt std::tavilySearch("Are you sure you want to perform this web search?", {
    query: query,
    count: count,
    searchDepth: searchDepth,
    topic: topic
  })
  return _tavilySearch(
    query,
    {
    count: count,
    apiKey: apiKey,
    searchDepth: searchDepth,
    topic: topic
  },
  )
}
