import { _search, _summary, _article } from "agency-lang/stdlib-lib/wikipedia.js"

/** @module
  @summary Search English Wikipedia and read article introductions or full text.
  Search English Wikipedia and read article summaries or full text.

  ```ts
  import { search, summary } from "std::wikipedia"

  node main() {
    const results = search("Ada Lovelace")
    if (results.length > 0) {
      const intro = summary(results[0].title)
      print(intro.extract)
    }
  }
  ```
*/

type WikiSearchResult = {
  title: string;
  description: string;
  excerpt: string
}

type WikiSummary = {
  title: string;
  description: string;
  extract: string;
  url: string
}

type WikiArticle = {
  title: string;
  text: string;
  url: string
}

effect std::wikipedia::search { query: string, limit: number }
effect std::wikipedia::summary { title: string }
effect std::wikipedia::article { title: string }

@capabilities(network)
export def search(query: string, limit: number = 5): WikiSearchResult[] raises <std::wikipedia::search> {
  """
  Find English Wikipedia articles matching a search query.
  """
  return interrupt std::wikipedia::search("Are you sure you want to search Wikipedia?", {
    query: query,
    limit: limit
  })

  return _search(query, limit)
}

@capabilities(network)
export def summary(title: string): WikiSummary raises <std::wikipedia::summary> {
  """
  Read the introductory summary of a Wikipedia article.

  @param title - An article title returned by Wikipedia search.
  """
  return interrupt std::wikipedia::summary("Are you sure you want to fetch this Wikipedia article summary?", {
    title: title
  })

  return _summary(title)
}

@capabilities(network)
export def article(title: string): WikiArticle raises <std::wikipedia::article> {
  """
  Read the full plain text of a Wikipedia article.

  @param title - An article title returned by Wikipedia search.
  """
  return interrupt std::wikipedia::article("Are you sure you want to fetch this Wikipedia article?", {
    title: title
  })

  return _article(title)
}
