import { NeedleOptions } from 'needle';
import { DuckbarImageResult } from '../types';
import { SafeSearchType, SearchTimeType } from '../util';
import { NewsResult } from './news';
import { VideoResult } from './videos';
/** The options for {@link search}. */
export interface SearchOptions {
    /** The safe search type of the search. */
    safeSearch?: SafeSearchType;
    /** The time range of the searches, can be a SearchTimeType or a date range ("2021-03-16..2021-03-30") */
    time?: SearchTimeType | string;
    /** The locale(?) of the search. Defaults to "en-us". */
    locale?: string;
    /** The region of the search. Defaults to "wt-wt" or all regions. */
    region?: string;
    /** The market region(?) of the search. Defaults to "US". */
    marketRegion?: string;
    /** The number to offset the results to. */
    offset?: number;
    /**
     * The string that acts like a key to a search.
     * Set this if you made a search with the same query.
     */
    vqd?: string;
}
/**
 * The search results from {@link search}.
 * `images`, `news`, `videos` and `related` only show up if the query
 * shows elements of these in a webpage search.
 */
export interface SearchResults {
    /** Whether there were no results found. */
    noResults: boolean;
    /** The VQD of the search query. */
    vqd: string;
    /** The web results of the search. */
    results: SearchResult[];
    /** The image results of the search. */
    images?: DuckbarImageResult[];
    /** The news article results of the search. */
    news?: NewsResult[];
    /** The video results of the search. */
    videos?: VideoResult[];
    /** The related searches of the query. */
    related?: RelatedResult[];
}
/** A web search result. */
export interface SearchResult {
    /** The hostname of the website. (i.e. "google.com") */
    hostname: string;
    /** The URL of the result. */
    url: string;
    /** The title of the result. */
    title: string;
    /**
     * The sanitized description of the result.
     * Bold tags will still be present in this string.
     */
    description: string;
    /** The description of the result. */
    rawDescription: string;
    /** The icon of the website. */
    icon: string;
    /** The ddg!bang information of the website, if any. */
    bang?: SearchResultBang;
}
export interface SearchResultBang {
    /** The prefix of the bang. (i.e. "w" for !w) */
    prefix: string;
    /** The title of the bang. */
    title: string;
    /** The domain of the bang. */
    domain: string;
}
export interface RelatedResult {
    text: string;
    raw: string;
}
/**
 * Search something.
 * @category Search
 * @param query The query to search with
 * @param options The options of the search
 * @param needleOptions The options of the HTTP request
 * @returns Search results
 */
export declare function search(query: string, options?: SearchOptions, needleOptions?: NeedleOptions): Promise<SearchResults>;
/** An auto-complete term. */
export interface AutocompleteTerm {
    /** The phrase of the auto-completed term. */
    phrase: string;
}
/** An auto-complete bang. */
export interface AutocompleteBang {
    /** The image of the bang */
    image: string;
    /** The prefix of the bang. */
    phrase: string;
    score: number;
    /** The title of the bang. */
    snippet: string;
}
export declare type AutocompleteResult = AutocompleteTerm | AutocompleteBang;
/**
 * Get auto-complete terms from a query.
 * @category Search
 * @param query The query to search
 * @param region The region to search as
 * @param needleOptions The options of the HTTP request
 * @returns Autocomplete terms
 */
export declare function autocomplete(query: string, region?: string, needleOptions?: NeedleOptions): Promise<AutocompleteResult[]>;
