import { IArgument } from "./utils/argument";
import { IFilter, Filter } from "./utils/filter";
import { IPager, Pager } from "./utils/pager";
import { ISort, Sort } from "./utils/sort";
import { RequestInfo } from "./interchange";
import { Header, Headers } from "./utils/headers";
import { IArgumentEncoder } from "./utils/encoders";
import { HttpVerb } from "./http/verb";
/**
 * Rule used to convert a request to the interchange format
 */
export interface GenerateRule {
    /**
     * Http verb
     */
    verb: HttpVerb | string;
    /**
     * Specific Argument Encoder
     */
    encoder: IArgumentEncoder;
}
/**
 * Other top level options for the construction of the request.
 */
export interface IRequestConfiguration {
    /**
     * Enable analytics for the request
     */
    analytics?: boolean;
    /**
     * Encode the arguments as a JSON object
     */
    json?: boolean;
}
/**
 * Interface for developers that just want to pass a object literal
 */
export interface IRequest {
    /**
     * Namespace where the API call lives
     */
    namespace?: string;
    /**
     * Method name of the API call.
     */
    method: string;
    /**
     * Optional list of arguments for the API call. You can use types
     *   * Argument or IArgument
     */
    arguments?: IArgument[];
    /**
     * Optional list of sorting rules to pass to the API call.
     */
    sorts?: ISort[];
    /**
     * Optional list of filter rules to pass to the API call.
     */
    filters?: IFilter[];
    /**
     * Optional list of columns to include with the response to the API call.
     */
    columns?: string[];
    /**
     * Optional pager rule to pass to the API.
     */
    pager?: IPager;
    /**
     * Optional additional configuration for the request.
     */
    config?: IRequestConfiguration;
    /**
     * Optional additional HTTP headers for the request.
     */
    headers?: Header[];
}
/**
 * Extra information about the request that generates the request.
 */
export interface IRequestMeta {
    /**
     * Request object that generated the RequestInfo object.
     * @type {Request}
     */
    request: Request;
}
/**
 * Extra information about the batch request that generates the request.
 */
export interface IBatchRequestMeta {
    /**
     * List of abstract request objects that make up the batch that generated the RequestInfo object.
     */
    requests: Request[];
}
/**
 * Abstract base class for all Request objects. Developers should
 * create a subclass of this that implements the generate() method.
 */
export declare abstract class Request {
    /**
     * Namespace where the API call lives
     * @type {string}
     */
    namespace: string;
    /**
     * Method name of the API call.
     * @type {string}
     */
    method: string;
    /**
     * Optional list of arguments for the API call.
     * @type {IArgument[]}
     */
    arguments: IArgument[];
    /**
     * Optional list of sorting rules to pass to the API call.
     */
    sorts: Sort[];
    /**
     * Optional list of filter rules to pass to the API call.
     */
    filters: Filter[];
    /**
     * Optional list of columns to include with the response to the API call.
     */
    columns: string[];
    /**
     * Optional pager rule to pass to the API.
     */
    pager: Pager;
    /**
     * Optional custom headers collection
     */
    headers: Headers;
    private _usePager;
    /**
     * Use the pager only if true.
     */
    get usePager(): boolean;
    /**
     * Default configuration object.
     */
    private defaultConfig;
    /**
     * Optional configuration information
     */
    config: IRequestConfiguration;
    /**
     * Create a new request.
     *
     * @param init   Optional request object used to initialize this object.
     */
    constructor(init?: IRequest);
    /**
     * Add an argument to the request.
     *
     * @param argument
     * @return Updated Request object.
     */
    addArgument(argument: IArgument): Request;
    /**
     * Add sorting rule to the request.
     *
     * @param sort Sort object with sorting information.
     * @return Updated Request object.
     */
    addSort(sort: ISort): Request;
    /**
     * Add a filter to the request.
     *
     * @param filter Filter object with filter information.
     * @return Updated Request object.
     */
    addFilter(filter: IFilter): Request;
    /**
     * Add a column to include in the request. If no columns are specified, all columns are retrieved.
     *
     * @param name Name of a column
     * @return Updated Request object.
     */
    addColumn(column: string): Request;
    /**
     * Add a custom http header to the request
     *
     * @param name Name of a column
     * @return Updated Request object.
     */
    addHeader(header: Header): Request;
    /**
     * Set the pager setting for the request.
     *
     * @param pager Pager object with pagination information.
     * @return Updated Request object.
     */
    paginate(pager: IPager): Request;
    /**
     * Generate the request interchange information. Note: This method is abstracted and
     * must be implemented in derived request generators.
     *
     * @param Rule used to create the interchange. If not provided, implementations
     *                               should select the rule to use.
     * @return Interchange data.
     */
    abstract generate(rule?: GenerateRule): RequestInfo;
}
